我有一个模板数组类重载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
答案 0 :(得分:1)
您遇到的问题是operator T*
和operator[]
都允许buf[some_position]
有效。在您的代码中T*
是int*
而int*
有[]
超载。
您可以使用此live example
查看答案 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
或修改运算符来取代$
来消除此调用的歧义。