【问题标题】:copy constructor error with example复制构造函数错误与示例
【发布时间】:2014-08-19 23:21:08
【问题描述】:

扩展我之前的post,我不明白,为什么这段代码会失败。这里没有明确的说明。

#include <vector>

class foo {
public:
   int num;
   int type;

   foo()
    : num(0)
    , type(0)
   {}
   foo(foo &a)
    : num(a.num)
    , type(a.type)
   {}
};

int main()
{
   foo theFoo;
   theFoo.num = 10;
   theFoo.type = 2;
   std::vector< foo > theVec;
   theVec.push_back(theFoo);
   return 0;
}

错误是

no matching function for call to ‘foo::foo(const foo&)’
mytest.cpp:12: note: candidates are: foo::foo(foo&)
mytest.cpp:8: note:                 foo::foo()

有人可以清楚地解释这里出了什么问题吗?

【问题讨论】:

  • foo(foo &amp;a) 更改为foo(const foo &amp;a)。 “真正的”复制构造函数采用 const 引用。
  • 该错误与我在链接中得到的相同。罪魁祸首是explicit。现在为什么我会得到同样的错误?
  • 错误信息应该有多明确?只是阅读它...
  • @Deduplicator:他的意思是explicit关键字,我猜...
  • @quantdev:我知道,但我没有将它用作那里的关键字。

标签: c++ vector copy-constructor


【解决方案1】:

错误信息很清楚。在声明中

theVec.push_back(theFoo);

使用了 std::vector push_back 类的成员函数,在类中声明如下

void push_back(const T& x);

如您所见,参数被定义为 const 引用。因此,要将对象 x 复制到容器中,对象的类型必须将复制构造函数声明为

T( const T & );

或者在你的情况下

foo( const foo &a );

但是你的类没有这样的构造函数。所以编译器会报错。

【讨论】:

  • 没错。还有一件事……如果 foo 构造函数是用 explicit 关键字定义的,我该如何 push_back?
  • @mahmood 你可以使用emplace_back
  • g++4.4 没有这样的向量成员
  • @mahmood 为什么不想定义所需的复制构造函数?
  • @mahmood 您可以简单地使用隐式复制构造函数,而不是显式定义它。只需删除您的复制构造函数。
猜你喜欢
  • 1970-01-01
  • 2023-04-05
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
  • 2017-08-18
  • 2011-03-21
  • 1970-01-01
相关资源
最近更新 更多