我已经编写了一个非常基础的类(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/

10-11 22:36
查看更多