c error:operator []:2次重载具有类似的转换

c error:operator []:2次重载具有类似的转换,第1张

概述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
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次重载具有类似的转换所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1223690.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存