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# - 你如何在 C# 中为我的撤消重做类只分配一个指针

c++ - 构建一个 pair(string, *node) 插入到一个 unordered_map

Drupal - 查找模板的一般方法?

使用模板的 C++ 抽象工厂

c++ - g++ 编译器 : optimization flag adds warning message

c++ - 不同线程中的多个 atexit 处理程序

c++ - 编译共享对象库,也从中调用函数

c++ - 简单的 istream_iterator 问题

c++ custom UI ToolKit -- 跨平台抽象层的选项

c++ - gcc 中的 basic_ofstream<unsigned char> 失败