繁体   English   中英

在VS2010中解析/实例化模板有问题吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM