C++ 错误 : operator []: 2 overloads have similar conversions

标签 c++ visual-c++ operator-overloading

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/

相关文章:

C++ 使用 operator int() 而不是 operator+

c++ - 以优雅的方式管理指向游戏引擎中被破坏对象的指针

c++ - 按字母顺序排列字符串数组(甚至 *ptr)

c++ - 重载 operator<< 以处理字符串

c++ - VC++ 2010 项目中的链接器错误 1120。

c++ - 我该怎么做才能修复 Visual Studio 不显示每个文件属性的问题?

C# 显式运算符和继承

c++ - 参数传递和返回值如何在x86上的C/C++中的汇编级别工作?

c++ - cout 变量和通过引用更改变量的函数

c++ - 从 C++ 中的二进制路径(命令行语句)获取进程 ID