我有一个类(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;'没有已知的转换
谢谢:)
答案 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&)
{
....
}