C++ 显式类型转换不适用于重载构造函数

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:

我最近从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:对重载函数的模糊调用

我发现的唯一的提示是消除这个错误是进行显式类型转换,但我已经完成了。实际上,我看不出需要任何类型转换,因为所有参数都完全适合构造函数参数

这是类定义(部分)


我想您需要在副本构造函数中添加常量:

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)
           ^^^^^ ~~~ !