使用QVector时,没有匹配的默认构造函数调用

Luc*_*984 3 c++ qt qvector

我有一个B类,它创建一个A类的对象并调用该对象的方法.

#ifndef A_H
#define A_H

class A
{
public:
    A(int);
    void function();
};

#endif // A_H
Run Code Online (Sandbox Code Playgroud)

a.cpp

#include "a.h"

A::A(int x)
{

}
void A::function(){
    //Do something.
}
Run Code Online (Sandbox Code Playgroud)

BH

#ifndef B_H
#define B_H
#include <QVector>
#include <a.h>


class B
{
public:
    B(int);
    QVector<A> list;
};

#endif // B_H
Run Code Online (Sandbox Code Playgroud)

b.cpp

#include "b.h"

B::B(int y)
{
    list.append(A(y));
    list[0].function();
}  
Run Code Online (Sandbox Code Playgroud)

问题是这不能编译.它返回"没有匹配的函数来调用'A:A()'".我知道这可以通过前向声明来解决,但这在这里不起作用,因为我想调用函数"function".我也不想把全班A都包括在B班.

Lig*_*ica 10

与许多Qt容器一样,您的版本中QVector的元素类型必须是可分配的数据类型.

与标准库不同,Qt将其定义为:

存储在各种容器中的值可以是任何可分配的数据类型.要限定,类型必须提供默认构造函数,复制构造函数和赋值运算符.

这真的很不幸,因为在你的例子中没有实际需要一个默认的构造函数,并且确实std::vector(通常)允许你使用没有构造函数的元素类型.

QVector::value(int)函数确实依赖于此属性,但您没有使用它!Qt开发人员必须预先进行某种检查,而不是采用标准库的方法"只检查实际需要时的前置条件",否则这是代码的"意外"!

因此,直到5.13更改它,你将不得不给出A一个默认的构造函数,抱歉.

不要忘记复制构造函数......以及对该A::function()定义的适当限定.

前瞻声明不会解决这个问题,你也不需要.实际上,在这个特定的程序中加一个就没什么了不起的.;)

  • 另一种解决方案是切换到`std :: vector`. (2认同)