gpt4 book ai didi

c++ - VS2010中解析/实例化模板有问题吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:25 24 4
gpt4 key购买 nike

请不要介意此代码的长度(只需复制和粘贴)。当你运行它时,它不会在 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;

直接在 main 中会导致相同的编译错误...

关于c++ - VS2010中解析/实例化模板有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5523182/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com