c error:operator []:2次重载具有类似的转换
发布时间:2020-12-16 10:54:11 所属栏目:百科 来源:网络整理
导读:template typename Tclass 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; } v
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> ] 编译器无法决定是否在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版本). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |