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
来消除此调用的歧义。
我有一个模板数组 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
来消除此调用的歧义。