我最近从VS6切换到VS-Express 2013.转换旧代码当然会给我带来很多警告和警告,但有一件事我真的很喜欢:
为什么我在这里收到错误?
当我尝试编译时
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:ambiguent调用重载函数。
我发现的唯一提示是消除此错误是为了进行明确的类型转换,但我已经这样做了。实际上我看不出需要任何类型转换,因为所有参数都非常适合构造函数参数。
这是类定义(部分)
class ParseValue
{
public:
ParseValue(ParseValue &pv) :_charval(""), _intval(pv._intval), _type(pv._type)
{
if (_type == P_LITERAL || _type == P_STRING || _type == P_REF)
{
_charval = pv._charval;
}
}
ParseValue(DataType dt) :_charval(""), _intval(0), _type(dt)
{
}
ParseValue(int num) :_charval(""), _intval(num), _type(NUM)
{
}
ParseValue(TCSymbolReference &ref) :_charval(""), _intval(0), _type(P_REF)
{
_charval = ref.Name();
}
ParseValue(const char *str) :_charval(""), _intval(0), _type(P_LITERAL)
{
_charval = str;
}
~ParseValue()
{
}
ParseValue operator ==(ParseValue &other);
ParseValue operator !=(ParseValue &other);
ParseValue operator *(ParseValue &other);
ParseValue operator /(ParseValue &other);
ParseValue operator %(ParseValue &other);
ParseValue operator +(ParseValue &other);
ParseValue operator -(ParseValue &other);
ParseValue operator &&(ParseValue &other);
ParseValue operator !();
ParseValue operator ||(ParseValue &other);
ParseValue operator &(ParseValue &other);
ParseValue operator |(ParseValue &other);
ParseValue operator ^(ParseValue &other);
ParseValue operator <(ParseValue &other);
ParseValue operator >(ParseValue &other);
ParseValue operator =(ParseValue &other);
ParseValue operator =(int num)
{
_intval = num;
_type = NUM;
return *this;
}
operator int();
operator char* ();
operator void* ();
int operator--();
int operator++();
}
这是编译错误(抱歉是德语)
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 &)"
答案 0 :(得分:0)
我想你需要在你的拷贝构造函数中添加const:
ParseValue(const ParseValue &pv)
^^^^^ ~~~ !
您应该始终使您的复制构造函数采用const引用参数。否则,如果你不需要const - 那么使用move构造函数。
错误的原因是您从函数返回值,因此编译器会创建一个临时值,该临时值将复制到您在函数调用位置中指定的任何变量 - 使用复制构造函数。编译错误的原因是,编译器创建的临时对象不能绑定到非const引用。在您的情况下,编译器会找到适合进行转换的转换运算符(您提供适当的构造函数),但由于它们不明确,您会得到错误。