我编写了一个非常基础的类
class A
{
int n;
public:
A(int& val){val=n;}
A(const int& val=0){n=val;}
A(A& val){n=val.n;}//work without this constructor
};
int main()
{
A a=3;//want to call A::A(const int&)
return 0;
}
我不想使用 A
实例的拷贝创建构造函数(供将来使用)
这个简单的代码有什么问题?
错误信息:
...\main.cpp||In function 'int main()':|
...\main.cpp|16|error: no matching function for call to 'A::A(A)'|
...\main.cpp|16|note: candidates are:|
...\main.cpp|11|note: A::A(A&)|
...\main.cpp|11|note: no known conversion for argument 1 from 'A' to 'A&'|
...\main.cpp|10|note: A::A(const int&)|
...\main.cpp|10|note: no known conversion for argument 1 from 'A' to 'const int&'|
...\main.cpp|9|note: A::A(int&)|
...\main.cpp|9|note: no known conversion for argument 1 from 'A' to 'int&'|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
似乎 3
被认为是 A
的一个实例?
如果我添加 A(const A& val){n=val.n;}
选择构造函数 A(const int&)
。
如果没有 A(const A& val)
,我该怎么做才能成功编译?
最佳答案
问题是你的复制构造函数:A(A& val) { n=val.n;
。
给定这一行 A a = 3;
一种可能性是使用 A a = A(3)
,这又将使用复制构造函数。但是,将临时绑定(bind)到非常量是违反标准的。一个合适的复制构造函数将解决这个问题。
示例代码
#include <iostream>
class A
{
int n;
public:
A(int& val) : n(val) { std::cout << "A(int&)\n"; }
A(const int& val=0) : n(val) { std::cout << "A(const int&)\n"; }
A(const A& val) : n(val.n) { std::cout << "A(const A&)\n"; }
};
int main()
{
A a = 3;
return 0;
}
示例输出
A(const int&)
注意:
- 上面的代码正确使用了初始化列表
- 输出显示复制构造函数并未实际调用
关于c++ - 错误 : no matching function for call to 'A::A(A)' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35203717/