首页 > 解决方案 > 与模板括号相关的奇怪编译错误解释为运算符“>”

问题描述

我在 Linux 上使用英特尔编译器时遇到了一个奇怪的编译错误。

所以我用 Compiler Explorer 做了一些测试。

这段代码在几个编译器上编译得很好:

enum class Enum {a, b};

template <int>
struct Base {
    template <Enum a, Enum b> void F(int) {}
};

template <int i>
struct Derived : Base<i> {

    void G() {
        Base<i>::F<Enum::a, Enum::b>(1);
    }
};

int main() {
    Derived<1> D;
}

但是使用 x86-64 gcc 8.1,我得到:

<source>: In member function 'void Derived<i>::G()':

<source>:12:36: error: no match for 'operator>' (operand types are 'Enum' and 'int')

         Base<i>::F<Enum::a, Enum::b>(1);

                             ~~~~~~~^~~~

这是一个与我使用 intel 编译器得到的非常相似的错误。不过,此示例在具有 icc 17 的编译器资源管理器上编译得很好。

在这两种情况下,如果我删除第二个模板参数,这编译得很好。

这里发生了什么?我可以使用什么解决方法?

标签: c++templatescompiler-bug

解决方案


推荐阅读