c++ - g++ 模板错误 Small_size

标签 c++ templates g++ c++14

我正在研究 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]$

我的问题是:

  1. 256 及以上的结果是错误的。见评论//1
  2. 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/

相关文章:

c++ - 使用 XMLString::release( XMLCh ** buf)

c++ - 来自 Objective-C++ 中我的 C++ 包装器和 swift 桥接 header 的 EXC_BAD_ACCESS Xcode

c++ - C++ 模板函数调用不在范围内

c++ - 类局部特化继承方法

c++ - 继承的默认构造函数也是用户定义的吗?

c++ - 不能使用 C 库(函数)

c++ - 对 STL::抽象数据类型列表进行排序

c++ - 返回类型扣: What method is preferred?

c++ - 如何用clang++编译boost单元测试模块?

c++ - 如何从成员函数模板类型签名中删除 const?