【问题标题】:make fails with error "cannot convert ‘std::istream {aka std::basic_istream<char>}’ to ‘bool’ in return"make 失败并出现错误“无法将‘std::istream {aka std::basic_istream<char>}’转换为‘bool’作为回报”
【发布时间】:2023-03-24 02:23:02
【问题描述】:

我正在尝试从源代码编译 libgtextutils(fastxtoolkit 需要)。 './configure' 命令运行良好,但随后的 'make' 命令会产生我无法解决的错误。

text_line_reader.cpp: In member function ‘bool TextLineReader::next_line()’:
text_line_reader.cpp:47:9: error: cannot convert ‘std::istream {aka std::basic_istream<char>}’ to ‘bool’ in return
  return input_stream ;
         ^~~~~~~~~~~~
make[3]: *** [text_line_reader.lo] Error 1
make[2]: *** [all-recursive] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

我使用的是 Mac,OSX 10.11.6 (Intel)

非常感谢任何可能解决此问题的建议。

【问题讨论】:

  • 你是在开启 C++11 的情况下编译的吗?
  • !!input_stream

标签: c++ macos c++11 makefile configure


【解决方案1】:

请参阅Porting to GCC 6 指南,该指南将此记录为您必须处理的更改之一,因为 GCC 6 默认为 C++14 模式而不是 C++03 模式:

无法将 'std::ostream' 转换为 'bool'

从 C++11 开始,iostream 类不再隐式转换为 void*,因此不再有效:

bool valid(std::ostream& os) { return os; }

必须更改此类代码才能将 iostream 对象显式转换为 bool,例如return (bool)os;return static_cast&lt;bool&gt;(os);

另一种选择是在编译器标志中显式使用-std=c++03 以在 C++03 模式下编译,但最好修复代码。上面给出的修复将使代码与任何 C++ 版本兼容。

【讨论】:

  • 您好,感谢您的回答,但是我需要更多关于如何在编译器标志中显式使用 -std=c++03 的说明。是在配置文件本身还是在使用“make”时?
  • 也许两者兼而有之。为什么不直接修复代码?该错误告诉您需要更改的文件和行号。那么你就不用担心如何使用-std=c++03选项了。
【解决方案2】:

这是因为使用了较新版本的 gcc 编译器 (C++11)。

使用static_cast&lt;bool&gt;() 解决问题。

例子:改变

success = move_group.move();

success = static_cast<bool>(move_group.move());

【讨论】:

    【解决方案3】:

    另一种选择是覆盖 make 命令中的 C++ 标志:

    make CXXFLAGS='-std=c++03 -O1'
    

    above所述,fastx也会有编译错误,但如果你通过了它就会编译

    make CXXFLAGS=-O1.

    【讨论】:

      【解决方案4】:

      根据 Muthanna 和 Jonathan 的回答,对于完全不了解 C++ 但想在 *unix 上安装 fastx-toolkit 并遇到这些具有挑战性的响应的任何人,答案是在解压缩源代码后运行它:

      cd libgtextutils-0.7
      sed -i '47s/input_stream/static_cast<bool>(input_stream)/' src/gtextutils/text_line_reader.cpp
      ./configure
      make
      make install
      

      这使得其他(显然更博学的)受访者建议做出改变,而不必理解他们正在谈论的单词。对于我们这些只是想安装一些旧软件并且不想学习如何编写 C++ 的人来说,它应该可以工作(只是...)

      【讨论】:

      • 另外,使用 gtextutils 编译 fastx-toolkit 时会出错。看看这个帖子github.com/agordon/fastx_toolkit/issues/14
      • 是的,相反,现在读者必须确保他们了解流编辑器 (sed) 的作用,以确保他们正确使用它并避免 C++ 路线:)
      猜你喜欢
      • 2022-09-28
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 2014-07-13
      • 2014-05-24
      • 2017-02-12
      • 1970-01-01
      相关资源
      最近更新 更多