我目前正在做一个小项目,在这里我操作一个枚举:
enum ThreeVal_t {T='T',F='F',U='U'};
我想创建
Atom
。定义如下:
class Atom :
{
private:
std :: string name;
ThreeVal_t val;
static int id;
public:
//constructors
Atom();
Atom(const Atom &at);
Atom(const ThreeVal_t at);
Atom(const ThreeVal_t &at);
//Destructor
~Atom();
};
运算符定义如下
Atom::Atom() : name("a_" + std::to_string(id)), val(U)
{
id++;
}
Atom::Atom(const Atom &at) : name("a_" + std::to_string(id)), val(at.val)
{
id++;
}
Atom::Atom(const ThreeVal_t at) : name("a_" + std::to_string(id)), val(at)
{
id++;
}
Atom::Atom(const ThreeVal_t &at) : name("a_" + std::to_string(id)), val(at)
{
id++;
}
我的问题是,当我调用
Atom a(U)
时,我从clang编译器收到以下错误:error: call to constructor of 'Atom' is ambiguous
Atom a(U);
^ ~
note: candidate constructor
Atom(const ThreeVal_t at);
^
note: candidate constructor
Atom(const ThreeVal_t &at);
^
note: candidate constructor
Atom(const Atom &at);
但是我认为,由于声明和定义不同,因此可以正常工作。
你知道为什么会模棱两可吗?
最佳答案
问题是在表达式中:Atom A(U)
同样,可以将U
正确解释为对U
或U
副本的引用。因此,它绑定到两个构造函数签名。这就是模棱两可的根源。
通常,您需要选择一种签名。如果要复制(或将临时对象移入对象),则按值传递。如果目的是使用对现有对象的不变引用,该引用将在调用构造函数后继续存在,请通过const引用传递。
class Atom
{
// ...
public:
// pass by value
Atom(ThreeVal_t at);
// ...
};
class Atom
{
// ...
public:
// pass by const reference
Atom(ThreeVal_t const & at);
// ...
};
关于c++ - 调用重载的构造函数会产生歧义错误C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58787441/