2

在创建 Matrix 类以方便地对数组进行多维访问时,我偶然发现了一个奇怪的错误:如果为 () 运算符创建多个重载,Visual Studio C++ 优化器(2010 和 2012)会崩溃。

我设法隔离了错误。将其作为单个代码文件放在项目中会使其崩溃:

template <class T>
class Foo
{
    T& Foo::operator() (int i)
    {
        return 0;
    }

    // C1001 - Commenting this second overload makes the compiler work correctly
    T& Foo::operator() (char c)
    {
        return 0;
    }
};

原始代码具有 (int x, int y) 的重载,另一个具有 (Vector2 pos) 的重载,但错误是相同的。

是否有解决方法,还是我必须忍受的 VS 错误?

4

2 回答 2

3

Foo::当它作为declarator-id时,不允许在您的类范围内使用。尝试这个 :

template <class T>
class Foo
{
    T& operator() (int i)
    // ^
    {
        return 0;
    }

    T& operator() (char c)
    // ^
    {
        return 0;
    }
};

此外,0当您尝试返回时,返回不会编译reference

最后,操作员private在您的示例中;)

于 2013-07-24T14:59:08.267 回答
1

这是您非法使用Foo::. 删除它,代码编译。看起来 VC++ 知道它无效,但不能报告编译错误。

template <class T>
class Foo
{
    T& operator() (int i)
    {
        return 0;
    }

    T& operator() (char c)
    {
        return 0;
    }
};
于 2013-07-24T14:56:29.923 回答