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

Tux*_*xer 10 c++ copy vector copy-constructor

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

std::vector<Uniform> uniforms
Run Code Online (Sandbox Code Playgroud)

我想填写使用

uniforms.push_back()
Run Code Online (Sandbox Code Playgroud)

线.我使用此代码来执行此操作(第二行仅用于测试复制构造函数,因为它当前失败)

Uniform uni(uniform_name,type);
Uniform uni2=uni;
uniforms.push_back(uni2);
Run Code Online (Sandbox Code Playgroud)

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

/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.0/../../../../include/c++/4.6.0/ext/new_allocator.h:108:9:erreur :没有匹配函数调用'Uniform :: Uniform(const Uniform&)'

/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.0/../../../../include/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:注意:Uniform :: Uniform(Uniform&)

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

谢谢 :)

AnT*_*AnT 12

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

编译器提供的复制构造函数的确切签名取决于Uniform类的内容.它可能Uniform::Uniform(const Uniform &)Uniform::Uniform(Uniform &)取决于Uniform(你没有提供)的细节.

例如,如果你Uniform包含一个类型的子对象(基类或成员)T,其复制构造函数被声明为T::T(T &)(no const),那么Uniform隐式构造函数也将被隐式声明为Uniform::Uniform(Uniform &)(no const).

完整的规格可以在语言标准中找到(12.8/5)

类X的隐式声明的复制构造函数将具有该表单

X::X(const X&)

如果

- X的每个直接或虚拟基类B都有一个复制构造函数,其第一个参数是const B&或const volatile B&,并且

- 对于类型为M(或其数组)的X的所有非静态数据成员,每个这样的类类型都有一个复制构造函数,其第一个参数是const M&或const volatile M&.

否则,隐式声明的复制构造函数将具有该表单

X::X(X&)

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

push_back实现需要Uniform::Uniform(const Uniform &)的事,但在你的类,导致其对Uniform::Uniform(Uniform &).因此错误.没有看到你的定义就没有办法说出它是什么Uniform.

  • @HighCommander - 如果类包含具有复制构造函数但没有`const`限定参数的成员,则隐式声明的复制构造函数也不会是`const`限定的. (5认同)