我碰到一个问题,将一些代码移植到MSVC中,令我感到困惑。据我所知,代码应该是合法的,Clang编译它就好了。为什么MSVC无法编译这个模板函数?
我已经收窄到以下几点:
enum E {
x
};
template <typename T>
struct traits {
static const E val = x;
};
template <E e>
struct S {
S(){};
};
template <typename T>
S<traits<T>::val> foo(T t);
int main() {
char c = 0;
foo(c);
}
注意,编译后的代码预计产量链接错误(我剥夺功能foo
的定义保持样品最小),但据我所知应该干净地编译。
但是,MSVC给了我这个错误:
error C2893: Failed to specialize function template 'S::val> foo(T)'
所以我的问题:
- 是MSVC在拒绝代码正确的机会吗? (如果是这样,为什么?)
- 如果没有,任何人都可以缩小它做错了什么?如同它是否是一种他们根本没有实现的语言特性(比如模板的两阶段名称查找),或者“只是”他们声称支持的功能实现中的一个普通错误?
我转载的问题上VC++ 2010和2012年
与今天早些时候的这个问题有关吗? [在类型推导之后,函数模板中的替换顺序是否有任何保证?](http://stackoverflow.com/questions/15462336/is-there-any-guarantee-on-the-order-of-substitution- in-a-function-template-after) – 2013-03-17 21:58:32
@BoPersson:似乎与我无关。在这里,我想不出任何其他问题。顺便说一句,它在GCC 4.7.2 – 2013-03-17 22:04:56
上按预期工作。而且,如果用'int'代替'enum',错误就会消失。它似乎是一个与'枚举'相关的错误 – 2013-03-17 22:05:36