我正在研究 C++ 编程语言的最新修订版(应该是 5),但遇到了 g++ 5.2 版的问题。
我的代码是第 24 章中 Small_size 模板的变体。
#include <iostream>
template<int N>
bool is_small ()
{
std::cerr << sizeof(N) << std::endl;
std::cerr << N << std::endl;
return N <= 255;
}
bool ism (int i_n)
{
return i_n <= 255;
}
int main ()
{
std::cout << "hallo welt" << std::endl;
std::cout << 0 << " " << is_small<0> << std::endl;
std::cout << 255 << " " <<is_small<255> << std::endl;
std::cout << -4100000000 << " " << is_small<-4100000000> << std::endl;
std::cout << 256 << " " << is_small<256> << std::endl;
std::cout << 256 << " " << ism(256) << std::endl;
std::cout << 256 << " " << (256 <= 255) << std::endl;
}
当我编译它时,没问题。但是当我运行它时,它似乎坏了。
[cpp11@hydra src]$ cat ~/bin/g14
#!/bin/bash
g++-52 -std=c++14 "${1}.C" -L$LIBPATH -o "$1"
[cpp11@hydra src]$ g14 konzept_small
[cpp11@hydra src]$ ./konzept_small
hallo welt
0 1
255 1
-4100000000 1
256 1 //1
256 0
256 0
[cpp11@hydra src]$
我的问题是:
- 256 及以上的结果是错误的。见评论//1
- 在
cerr
上没有模板代码的输出
我从没有 cerr
的版本开始,但只得到了错误的模板结果。
我从模板中删除了一个 constexpr
,但没有任何变化。
所以我在最后一步添加了 cerr
以查看问题所在。
有什么想法吗?
最佳答案
您没有调用 is_small<N>
, 但只是打印出它的地址。您需要将代码更改为
std::cout << 0 << " " << is_small<0>() << std::endl;
std::cout << 255 << " " <<is_small<255>() << std::endl;
std::cout << -4100000000 << " " << is_small<-4100000000>() << std::endl;
std::cout << 256 << " " << is_small<256>() << std::endl;
注意添加的 ()
.虽然不确定为什么会得到这样的输出,但您确定运行的是与发布的相同的代码吗?
关于c++ - g++ 模板错误 Small_size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31562421/