template <typename T>
class v3 {
private:
T _a[3];
public:
T & operator [] (unsigned int i) { return _a[i]; }
const T & operator [] (unsigned int i) const { return _a[i]; }
operator T * () { return _a; }
operator const T * () const { return _a; }
v3() {
_a[0] = 0; // works
_a[1] = 0;
_a[2] = 0;
}
v3(const v3<T> & v) {
_a[0] = v[0]; // Error 1 error C2666: 'v3<T>::operator []' : 2 overloads have similar conversions
_a[1] = v[1]; // Error 2 error C2666: 'v3<T>::operator []' : 2 overloads have similar conversions
_a[2] = v[2]; // Error 3 error C2666: 'v3<T>::operator []' : 2 overloads have similar conversions
}
};
int main(int argc, char ** argv)
{
v3<float> v1;
v3<float> v2(v1);
return 0;
}
最佳答案
如果您阅读错误消息的其余部分(在输出窗口中),它会变得更加清晰:
1> could be 'const float &v3<T>::operator [](unsigned int) const'
1> with
1> [
1> T=float
1> ]
1> or 'built-in C++ operator[(const float *, int)'
1> while trying to match the argument list '(const v3<T>, int)'
1> with
1> [
1> T=float
1> ]
编译器无法决定是使用重载的 operator[]
还是 const T*
上的内置 operator[]
> 可以通过以下转换函数得到:
operator const T * () const { return _a; }
以下两个都是对违规行的潜在有效解释:
v.operator float*()[0]
v.operator[](0)
您可以通过显式地将整数索引转换为无符号来消除歧义,这样就不需要转换了:
_a[0] = v[static_cast<unsigned int>(0)];
或者通过更改重载的operator[]
s 来采用int
而不是unsigned int
,或者通过删除 operator T*() const
(为了完整起见,可能还有非常量版本)。
关于C++ 错误 : operator []: 2 overloads have similar conversions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1726740/