【发布时间】:2013-03-06 04:27:17
【问题描述】:
我在将一些代码移植到 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 上重现了这个问题。
【问题讨论】:
-
@BoPersson:似乎与我无关。除了这里的错误,我想不出其他任何东西。顺便说一句,它在 GCC 4.7.2 上按预期工作
-
此外,如果将
enum替换为int,则错误消失。好像是enums相关的bug -
当然这是一个错误。 The compiler failed to do this or that,谁在乎?我需要知道我的程序违反了哪种语言规则,如果这或多或少晦涩难懂,请引用标准。一些编译器编写者根本不知道。尽管如此,我还是会尝试实例化
traits<char>和S<traits<char>::val>,只是为了看看编译器的反应。 -
@n.m.:没有人说“这是一个错误”就足够了。我们只是在写 cmets。另外,由于我认为这是一个编译器错误,我相信该程序没有违反任何规则。
标签: c++ templates visual-c++