我是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'的冲突类型...
1条答案
按热度按时间uidvcgyl1#
这可能总是错误的(假设在您的代码中没有隐藏用户定义的
operator<<
重载候选项)。在标准库中,从来没有任何
operator<<
的重载会将两个std::ostringstream
或相关类型作为参数。在C++11之前,选择的重载应该是
因为
_os << r._os
的右边std::ostringstream
的std::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。