【问题标题】:Error overloading () operator in a C++ template classC++ 模板类中的错误重载 () 运算符
【发布时间】:2013-07-24 14:33:06
【问题描述】:

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

【问题讨论】:

  • 可能是因为类型被有效地视为相同?由于 char 在传递给函数之前被提升为 int
  • 尝试使用 (int i, int j) 更改其中一个的签名。同样的事情发生
  • @Osguima3 如果您的问题得到解决,请考虑将您的问题标记为已回答;)

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


【解决方案1】:

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

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

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

此外,返回 0 将不会编译,因为您试图返回 reference

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

【讨论】:

  • 在类的定义中使用Foo:: 是“正确的”(它是注入的类名),但在 declarator-id 中是不允许的(像任何其他资格一样)如果引用的名称尚未声明。
  • 返回0和返回NULL不一样吗?无论如何,这只是孤立的代码,当然私有运营商没有意义;)
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    相关资源
    最近更新 更多