我在将一些代码移植到 MSVC 时遇到了问题,这让我很困惑。据我所知,代码应该是合法的,Clang 编译它就好了。
我把它缩小到以下几点:
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 给了我这个错误:
错误 C2893:无法专门化函数模板 'S::val> foo(T)'
所以我的问题:
- MSVC 在拒绝代码方面是否正确?(如果是这样,为什么?)
- 如果没有,任何人都可以缩小它做错的范围吗?例如,这是他们根本没有实现的语言功能(例如模板的两阶段名称查找),还是在他们声称支持的功能的实现中“只是”一个简单的错误?
我已经在 VC++ 2010 和 2012 上重现了这个问题。