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

时间:2019-01-14 12:06:42

标签: c++ qt qvector

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

a.h

#ifndef A_H
#define A_H

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

#endif // A_H

a.cpp

#include "a.h"

A::A(int x)
{

}
void A::function(){
    //Do something.
}

b.h

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


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

#endif // B_H

b.cpp

#include "b.h"

B::B(int y)
{
    list.append(A(y));
    list[0].function();
}  

问题是这无法编译。它返回“没有匹配的函数来调用'A:A()'”。我知道可以使用前向声明解决此问题,但这在这里不起作用,因为我想将函数称为“函数”。我也不想将整个A类都包括在B类中。

2 个答案:

答案 0 :(得分:8)

与许多Qt容器一样,您的版本中为QVector's element type must be an assignable data type

不同于标准库Qt defines this as

  

存储在各个容器中的值可以是任何可分配的数据类型。要获得资格,类型必须提供默认的构造函数,副本构造函数和赋值运算符。

这真的很不幸,因为there's no practical need for a default constructor in your examplestd::vector的确可以(合规地)让您使用没有一个的元素类型。

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

因此,until 5.13 in which this was changed您将不得不给A一个默认的构造函数,抱歉。

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

前向声明不能解决这个问题,您也不需要一个。实际上,在此特定程序中添加一个实际上不会执行任何操作。 ;)

答案 1 :(得分:0)

a.cpp中的第一个更新函数定义:

void A::function(){  // A: added
    //Do something.
}

第二,我将添加A(const A&)复制构造函数,因为list可能出于内部缓冲区重新分配目的而需要它。

相关问题