C++ 显式类型转换不适用于重载构造函数
我最近从VS6切换到VS Express 2013。转换旧代码当然会给我带来很多警告,但有一件事我真的很纠结: 为什么我会在这里出错 当我试图编译C++ 显式类型转换不适用于重载构造函数,c++,constructor,overloading,C++,Constructor,Overloading,我最近从VS6切换到VS Express 2013。转换旧代码当然会给我带来很多警告,但有一件事我真的很纠结: 为什么我会在这里出错 当我试图编译 ParseValue op_ParseValue() { switch (m_dt) { case NUM: return ParseValue( (int) Value); break; case P_STRING:
ParseValue op_ParseValue()
{
switch (m_dt)
{
case NUM:
return ParseValue( (int) Value);
break;
case P_STRING:
return ParseValue((const char*)Symbol_Name);
break;
case P_LITERAL:
return ParseValue(Symbol_Name);
break;
case P_ERROR:
return ParseValue(P_ERROR);
break;
}
return ParseValue(P_ERROR);
};
我得到一个编译器错误C2668:对重载函数的模糊调用
我发现的唯一的提示是消除这个错误是进行显式类型转换,但我已经完成了。实际上,我看不出需要任何类型转换,因为所有参数都完全适合构造函数参数
这是类定义(部分)
我想您需要在副本构造函数中添加常量:
ParseValue(const ParseValue &pv)
^^^^^ ~~~ !
您应该始终使复制构造函数接受常量引用参数。否则,如果不需要常量,则使用move构造函数
出现错误的原因是您正在按函数的值返回,因此编译器会创建一个临时变量,并使用复制构造函数将其复制到您在函数调用位置指定的任何变量。编译器错误的原因是,编译器创建的临时对象无法绑定到非常量引用。在您的例子中,编译器找到了转换运算符,它发现转换运算符适合于执行转换(您提供了适当的构造函数),但由于它们不明确,您会得到错误。此代码中有许多未知项。什么是
TCSymbolReference
?什么是数据类型
?什么是值
和符号\u名称
?什么是P_错误?为什么operator==
不返回bool
?与其开始一个20个问题的游戏,不如发布一个自包含的代码示例。我们需要一个-1来显示Symbol\u Name
和P\u ERROR
的类型,它可能会混淆要调用什么构造函数,因为您使用的是按引用传递和整数。它们都是可互换的(在x86体系结构上)。此外,你还应该使用C++风格的铸件(即代码> STATICEXCAST )而不是C风格的铸件。
1>c:\users\mkilianj\documents\testimprovement\bidl\parsetree1.h(225): error C2668: 'ParseTree::ParseValue::ParseValue': Mehrdeutiger Aufruf einer überladenen Funktion
1> c:\users\mkilianj\documents\testimprovement\bidl\parsetree1.h(56): kann 'ParseTree::ParseValue::ParseValue(const char *)' sein
1> c:\users\mkilianj\documents\testimprovement\bidl\parsetree1.h(51): oder "ParseTree::ParseValue::ParseValue(TCSymbolReference &)"
1> c:\users\mkilianj\documents\testimprovement\bidl\parsetree1.h(47): oder "ParseTree::ParseValue::ParseValue(int)"
1> c:\users\mkilianj\documents\testimprovement\bidl\parsetree1.h(44): oder "ParseTree::ParseValue::ParseValue(ParseTree::DataType)"
1> c:\users\mkilianj\documents\testimprovement\bidl\parsetree1.h(37): oder "ParseTree::ParseValue::ParseValue(ParseTree::ParseValue &)"
ParseValue(const ParseValue &pv)
^^^^^ ~~~ !