我在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编译得很好。
在这两种情况下,如果删除第二个模板参数,则编译正常。
这里发生了什么? 我可以使用哪种解决方法?