与模板括号相关的奇怪编译错误被解释为运算符">"

时间:2018-05-31 16:31:45

标签: c++ templates compiler-bug

我在linux上使用intel编译器时出现了一个奇怪的编译错误。

所以我用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编译得很好。

在这两种情况下,如果删除第二个模板参数,则编译正常。

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

0 个答案:

没有答案