C ++编译错误,ambigous运算符重载

时间:2015-06-19 14:11:45

标签: c++ class operator-overloading ambiguous

我有一个模板数组类重载operator []来访问项目和operator T *以获得直接缓冲区访问。

template< typename T > class buffer
{
    const T & operator [] ( size_t ) const;
          T & operator [] ( size_t );

    operator const T * () const;
    operator       T * ();
};

出于某种原因,在此类的实例上使用operator []会生成编译错误,指出存在4个可能的重载。

buffer< int > buf;
buf[ some_position ] = 0; // Generates an error

错误:

Error   3   error C2666: 'XXX::buffer<T>::operator []' : 4 overloads have similar conversions   c:\XXX.cpp  3886

operator []是否尝试将我的实例buf转换为T *?为什么检测到4个重载而不是2个?谢谢。 :)

编辑: 实际上是:buf[ some_position ] = 0; // Generates an error

2 个答案:

答案 0 :(得分:1)

您遇到的问题是operator T*operator[]都允许buf[some_position]有效。在您的代码中T*int*int*[]超载。

您可以使用此live example

查看

我认为这可能是你VS的一个问题,因为在Coliruideone上运行代码并进行一些修改以使其运行并提供工作代码。

答案 1 :(得分:1)

问题是你有两个方向的隐式转换。

无视const,您的两位候选人是:

T & buffer::operator [] ( size_t );
int& operator[] (int*, int);

对于buf[pos] pos int pos(例如文字)的来电,来电不明确。可以通过将std::size_t转换为buf来选择第一个候选人,并且可以通过将int*转换为std::size_t来选择第二个候选人。

您可以通过将参数显式地转换为int或修改运算符来取代$来消除此调用的歧义。