linux 不匹配'operator< < '(可能是由于我的c++/gcc版本?)

irtuqstp  于 2023-06-29  发布在  Linux
关注(0)|答案(1)|浏览(104)

我是C新手。我最近尝试通过虚拟机(UTM)在我的MacBook Air中设置NetBeans并运行c程序。它在我公司的Linux桌面上运行得很好,但不知何故,它在我的虚拟Linux上就不起作用了。这两个平台的源代码是相同的,但他们有不同的编译结果。一个正常,另一个显示下面的错误消息。
错误:没有匹配'operator<<'
我想知道这是否是由于版本不匹配或这两个Linux环境的相似之处。顺便说一句,这个程序的作者已经离开了公司,所以我正在尽我所能去理解他的代码。我在这里看到了几篇关于这个完全相同的问题的文章,但是似乎没有一个解决方案可以在我的情况下工作,这个源代码在一个Linux中工作得很好,而在另一个Linux中不工作。
下面是错误消息和相关源代码。你能帮我查一下吗?非常感谢!
源代码:

class logger
    {
      public:
        typedef std::ostringstream collector_stream_type;

      private:
        collector_stream_type _os;
        log_levels _messageLevel;

       public:
           logger(const logger & r) : _messageLevel(r._messageLevel)
              {
                   if ( do_log() ) _os << r._os; // this is where the error occurs.
               }
    }

来自NetBeans的错误/警告消息
包含在文件中

  • 错误:没有匹配'operator<<'(操作数类型是'MySoftware::log::logger::collector_stream_type' {aka 'std::__cxx11::basic_ostringstream'}和'const collector_stream_type' {aka 'const std::__cxx11::basic_ostringstream'})
  • 注意:无法将'r.MySoftware::log::logger::_os'(type 'const collector_stream_type' {aka 'const std::__cxx11::basic_ostringstream'})转换为类型'const std::error_code&'
  • 注意:'const collector_stream_type' {aka 'const std::__cxx11::basic_ostringstream'}不是从'const std::complex '派生<_Tp>的
  • 注意:无法转换'((MySoftware::log::logger*)this)->MySoftware::log::logger::_os'(type 'MySoftware::log::logger::collector_stream_type' {aka 'std::__cxx11::basic_ostringstream'})到类型'std::byte'
  • 注:候选人:'operator<<(int,int)'(内置)
  • 注意:'const collector_stream_type' {aka 'const std::__cxx11::basic_ostringstream'}不是从'const std::_shared_ptr<_Tp,_Lp>'派生的
  • 注意:推导出参数'_CharT'('char'和'std::__cxx11::basic_ostringstream'的冲突类型...
uidvcgyl

uidvcgyl1#

这可能总是错误的(假设在您的代码中没有隐藏用户定义的operator<<重载候选项)。
在标准库中,从来没有任何operator<<的重载会将两个std::ostringstream或相关类型作为参数。
在C++11之前,选择的重载应该是

std::basic_ostream::operator<<(const void*)

因为_os << r._os的右边std::ostringstreamstd::basic_ios基类有一个到void*的转换函数,它可以隐式地将r._os转换为void*。如果流处于fail()状态,则结果将是空指针,否则为 * 任何 * 其他指针值。
结果是,如果r._os处于fail()状态,则_os << r._os将向_os写入空指针的数字表示,否则将向_os写入指针值的任何其他数字表示。
这似乎不是故意的。
从C++11开始,转换函数已改为转换为bool,并已变为explicit,因此使用operator<<(const void*)重载的隐式转换不再可行。这一变化正是为了防止此类错误。
旁注:错误消息不是来自Netbeans。Netbeans是你的IDE。错误消息来自您的编译器,根据您编写的内容,它似乎是GCC。

相关问题