[英]Is it problem with parsing/instantiating templates in VS2010?
请不要介意此代码的长度(只需复制和粘贴)。 当你这样做运行它,它将无法在VS2010下编译。 为了编译这段代码,在struct Range中从模板参数和main中删除“class IntType”,而不是:
Range<int,float> r;
使
Range<float> r; //int is removed
码:
template<class T>
struct Assign_Low_High
{
static const int low_value = 0;
};
//in order to compile remove class IntType, from template params of Range struct
template<class IntType, class L>
struct Range
{
static_assert(Assign_Low_High<L>::low_value < 1,
"Incorrect Range");
};
int main()
{
//in order to compile remove int from Range
Range<int,float> r;
return 0;
}
到底是怎么回事? (它确实与GCC 4.5.1一起编译)。
好吧,看起来<运算符会使编译器偏离错误的轨道。 如果你:
static_assert( Assign_Low_High<L>::low_value > -1, "Incorrect Range");
要么
static_assert( (Assign_Low_High<L>::low_value) < 1, "Incorrect Range");
它会工作。
如果你这样做:
static_assert( Assign_Low_High<L>::low_value < 1 > 0, "Incorrect Range");
然后它变得有趣......
我认为编译器应该将low_value依赖名称视为非类型非模板依赖名称,并将low_value后面的“<”视为小于运算符。 所以我会说gcc编译器做正确的事情,而MS 2010编译器没有,但幸运的是它可以帮助产生所需的效果。
还有一件事,这显然不是由于static_assert,因为:
bool bComp = Assign_Low_High<int>::low_value < 1;
直接在主要导致相同的编译错误...
我现在无法编译,但它看起来像你的static_assert失败了。 当你实际上等于0时,你断言低值小于0。
如果那不是问题,你介意发布编译错误吗?
编辑将静态断言移动到Range的构造函数正确编译,并且在您使用模板时仍然可以实现断言的目标。 基于此,以及断言中的子句在不在断言时编译的事实,我会假设MS的static_assert实现有点错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.