加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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版本).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读