使用默认复制构造函数的C ++ vector :: push_back

时间:2011-06-10 18:35:53

标签: c++ vector copy copy-constructor

我有一个类(Uniform),它有一个带2个参数的构造函数和一个默认的复制构造函数(它只包含int,float,std :: vector和std :: map)。我创建了一个

std::vector<Uniform> uniforms

我想用

填写
uniforms.push_back()

线。我使用这段代码来做到这一点(第二行就是在这里测试复制构造函数,因为它当前失败了)

Uniform uni(uniform_name,type);
Uniform uni2=uni;
uniforms.push_back(uni2);

默认构造函数工作正常,“uni2 = uni”编译没有问题(因此默认的复制构造函数也可以),但push_back返回(使用g ++作为编译器):

  

/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.0 /../../../../包括/ C ++ / 4.6.0 / EXT / new_allocator.h:108: 9:erreur:没有匹配函数调用'Uniform :: Uniform(const Uniform&amp;)'

     

/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.0 /../../../../包括/ C ++ / 4.6.0 / EXT / new_allocator.h:108: 9:注意:候选人是:

     

./ inc / uniform.h:16:5:注意:Uniform :: Uniform(std :: string,Uniform_Type)

     

./ inc / uniform.h:16:5:注意:候选人需要2个参数,1提供

     

./ inc / uniform.h:14:7:注意:制服::制服(统一&amp;)

     

./ inc / uniform.h:14:7:注意:参数1从'const Uniform'到'Uniform&amp;'没有已知的转换

谢谢:)

4 个答案:

答案 0 :(得分:12)

当你说“默认复制构造函数”(通常没什么意义)时,我假设你的意思是“隐式声明的复制构造函数”或“编译器提供的复制构造函数”

编译器提供的复制构造函数的确切签名取决于Uniform类的内容。它可以是Uniform::Uniform(const Uniform &)Uniform::Uniform(Uniform &),同样取决于Uniform(您未提供)的详细信息。

例如,如果您的Uniform包含T类型的子对象(基础或成员),其副本构造函数声明为T::T(T &)(无const),则Uniform的隐式构造函数也将隐式声明为Uniform::Uniform(Uniform &)(无const)。

完整规范可在语言标准(12.8 / 5)

中找到
  

隐式声明的副本   类X的构造函数将具有   表格

     

X::X(const X&)

     

如果

     

- 每个   X的直接或虚拟基类B.   有一个复制构造函数,其第一个   参数类型为const B&amp;或const   挥发性B&amp;和

     

- 为所有人   X的非静态数据成员   M类(或其数组)的类,   每个这样的类类型都有一个副本   构造函数,其第一个参数是   类型为const M&amp;或const volatile   M&安培;

     

否则,隐含   声明的拷贝构造函数将具有   表格

     

X::X(X&)

     

这是   隐式声明的复制构造函数   是其内联的公共成员   类。

push_back实施需要Uniform::Uniform(const Uniform &),但是您班级中的某些内容会使其成为Uniform::Uniform(Uniform &)。因此错误。如果没有看到Uniform的定义,就无法说出它是什么。

答案 1 :(得分:1)

您的复制构造函数需要将其参数作为 const 引用:

Uniform::Uniform(const Uniform& other)

答案 2 :(得分:1)

您的复制构造函数应该接受const Uniform&而不是Uniform&

答案 3 :(得分:0)

您未能包含复制构造函数(sic !!!)但您必须错误地定义它:

Uniform::Uniform(Uniform&)
{
     ....
}

应该是(注意 const

Uniform::Uniform(const Uniform&)
{
     ....
}