C++运算符重载 - 从类转换

Fre*_*ner 2 c++ gcc operator-overloading operators operator-keyword

在将Windows代码移植到Linux时,我在GCC 4.2.3中遇到以下错误消息.(是的,我知道这是一个旧的版本,但我不能轻易升级.)

main.cpp:16: error: call of overloaded ‘list(MyClass&)’ is ambiguous
/usr/include/c++/4.2/bits/stl_list.h:495: note: candidates are: std::list<_Tp, _Alloc>::list(const std::list<_Tp, _Alloc>&) [with _Tp = unsigned char, _Alloc = std::allocator<unsigned char>]
/usr/include/c++/4.2/bits/stl_list.h:484: note:                 std::list<_Tp, _Alloc>::list(size_t, const _Tp&, const _Alloc&) [with _Tp = unsigned char, _Alloc = std::allocator<unsigned char>]
Run Code Online (Sandbox Code Playgroud)

我正在使用以下代码生成此错误.

#include <list>
class MyClass
    {
    public:
        MyClass(){}

        operator std::list<unsigned char>() const { std::list<unsigned char> a; return a; }
        operator unsigned char() const { unsigned char a; return a; }

    };

    int main()
    {
        MyClass a;
        std::list<unsigned char> b = (std::list<unsigned char>)a;

        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

有没有人遇到过这个错误?更重要的是,如何绕过它?(这是可以完全避免过载,肯定的是,通过使用功能,如GetChar(),GetList()等,但我想避免这种情况.)

(顺便说一句,删除" operator unsigned char()"会删除错误.)

CB *_*ley 6

模糊性来自对演员表达的解释.

选择转换时,编译器首先考虑static_cast样式转换,并考虑如何解决如下所示的初始化:

std::list<unsigned_char> tmp( a );
Run Code Online (Sandbox Code Playgroud)

这种结构是模糊的,因为a用户定义的转换为a std::list<unsigned char>和a ,unsigned char并且std::list<unsigned char>有一个构造函数,它接受const std::list<unsigned char>&一个构造函数 size_t(unsigned char可以被提升).

当转换为a时const std::list<unsigned_char>&,会考虑初始化:

const std::list<unsigned_char>& tmp( a );
Run Code Online (Sandbox Code Playgroud)

在这种情况下,当选择用户定义的转换时std::list<unsigned_char>,新引用可以直接绑定到转换结果.如果必须创建用户定义的转换到unsigned char所选类型的临时对象,std::list<unsigned char>这使得此选项的转换序列比前一个选项更差.