【问题标题】:No matching call to default constructor, when using QVector使用 QVector 时,没有对默认构造函数的匹配调用
【发布时间】:2019-06-08 10:12:58
【问题描述】:

我有一个 B 类,它创建一个 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 类中。

【问题讨论】:

  • 看起来 Qt 要求使用默认构造函数。
  • 您的解释不太正确。 “没有匹配的函数来调用'A:A()'”意味着A没有默认构造函数,但你正在尝试调用它

标签: c++ qt qvector


【解决方案1】:

与许多 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() 定义的适当限定。

前向声明不能解决这个问题,你也不需要。事实上,在这个特定的程序中添加一个实际上不会有任何作用。 ;)

【讨论】:

  • 另一种解决方案当然是切换到std::vector
  • 大家好消息!在 5.13 (commit) 中终于放弃了对 QVector 的默认构造函数的要求。
  • Qt 开发人员必须预先进行某种检查,而不是采用标准库的“仅在实际需要时检查前置条件”的方法。更糟糕的是......这只是草率的编码,例如从插入函数或类似的东西调用resize() :-(
  • @peppe:可能。可能不是。 (如果您从源头上确实知道其他情况,请忽略!)
  • 血腥细节:在 5.12 中 detach()(由任何非常量函数调用,例如插入函数)调用 reallocData(),这是一个通用的分离函数,分配、调整大小、保留等。结果是强加的要求。其他功能也被草率编码(例如clear()在5.12调用resize(0))。
【解决方案2】:

首先在a.cpp更新函数定义:

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

其次,我会添加A(const A&amp;) 复制构造函数,因为列表可能需要它来进行内部缓冲区重新分配。

【讨论】:

  • 虽然function 定义当前已损坏,并且应该添加复制构造函数是对的,但这些都不能回答问题,这就是为什么要调用默认构造函数以及如何最好地解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2018-09-11
  • 2014-10-11
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 2013-03-20
相关资源
最近更新 更多