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> with1> [1> T=float1> ]1> or 'built-in C++ operator[(const float *,int)'1> while trying to match the argument List '(const v3<T>,int)'1> with1> [1> T=float1> ]
编译器无法决定是否在const T *上使用重载的operator []或内置的operator [],它可以通过以下转换函数获得:
operator const T * () const { return _a; }
以下两个都是对违规行的潜在有效解释:
v.operator float*()[0]v.operator[](0)
您可以通过显式地将整数索引转换为无符号来消除歧义,以便不需要转换:
_a[0] = v[static_cast<unsigned int>(0)];
或者通过更改重载的operator []来获取int而不是unsigned int,或者删除运算符T *()const(为了完整性,也可以删除非const版本).
总结以上是内存溢出为你收集整理的c error:operator []:2次重载具有类似的转换全部内容,希望文章能够帮你解决c error:operator []:2次重载具有类似的转换所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)