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.