C ++模板类中的错误重载()运算符

时间:2013-07-24 14:33:06

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

在创建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错误?

2 个答案:

答案 0 :(得分:3)

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

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

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

此外,当您尝试返回0时,返回reference将无法编译。

最后,您的示例中的运算符为private;)

答案 1 :(得分:1)

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

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

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