C++ 编译错误,不明确的运算符重载

C++ compilation error, ambigous operator overloads

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

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

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

出于某种原因,在此 class 的实例上使用 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

您遇到的问题是 operator T*operator[] 都将允许 buf[some_position] 有效。在你的代码中 T* 是一个 int* 并且 int* 有一个 [] 重载。

你可以看到这个 live example

我认为这可能是你 VS 的一个问题,因为 运行 对 Coliru and ideone 上的代码进行了一些修改以使其达到 运行 都提供了工作代码。

问题是你有双向的隐式转换。

忽略 const,您的两个候选人是:

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

对于调用 buf[pos],其中 pos 是一个 int(例如文字),调用是不明确的。第一个候选可以通过将 pos 转换为 std::size_t 来选择,第二个可以通过将 buf 转换为 int*.

选择

您可以通过将参数显式转换为 std::size_t 或修改运算符以采用 int 来消除此调用的歧义。