我已经编写了一个非常基础的类(class)
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 = 3;
正在使用copy initialisation工作。为此,需要
A
的副本并妥善制作。您有两个构造函数,以int
作为参数(explicit
都不是)。该副本无法绑定(bind)到
A(A& val)
,因为普通引用不会绑定(bind)到临时值。可能的解决方案,直接初始化;
A a { 3 };
将复制构造函数添加或更改为move构造函数;
A(A&& val);
在复制构造函数中添加一个
const
(尽管这不是您想要的,但它确实起作用了);A(A const& val);
注意lang和g++的都正确拒绝了原始代码,但是VC++接受了它。
关于c++ - 错误:没有匹配函数调用 'A::A(A)',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35203717/