我在将一些代码移植到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 是否有可能正确地拒绝该代码?(如果是,为什么?) - 如果不是,是否可以缩小其出错的范围?也就是说,它是一个语言功能,他们根本没有实现(如用于模板的两阶段名称查找),还是在其声称支持的功能实现中存在“普通”的 bug?
我已经在 VC++2010和2012上重现了此问题。
traits <char>
和S <traits <char> ::val>
,只是为了看看编译器的反应。 - n. m.