2013-07-24 29 views
2

在创建Matrix类以便轻松地多维访问数组时,我偶然发现了一个奇怪的错误:如果为()运算符创建多个重载,Visual Studio C++优化程序(2010年和2012年)崩溃。Error在C++模板类中重载()运算符

我设法隔离错误。在一个项目中把这个作为单一代码文件将使它崩溃:

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错误,我将不得不忍受?

+0

可能是因为类型有效一样对待?由于'char'被传递给函数 –

+0

前被提升为'int'尝试使用(int i,int j)更改其中一个的签名。同样的事情发生 – Osguima3

+0

@ Osguima3考虑把你的问题标记为回答,如果你的问题解决了;) –

回答

3

不允许使用Foo::类范围内时,它是作为一种声明符-ID。试试这个:

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

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

而且,当你试图返回reference返回0将无法​​编译。

最后,运营商private在你的例子;)

+0

在类的定义中使用'Foo ::'是正确的(它是注入类名),但它是如果引用的名称尚未声明,则不允许在* declarator-id *中(与其他任何资格一样)。 – dyp

+0

@DyP你说得对,我会改变这一点。 –

+0

返回0是否与返回NULL相同?无论如何,这只是孤立的代码,当然,私人运营商没有任何意义;) – Osguima3

1

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

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

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