1

我有一些代码可以在 Linux 上编译,但无法在我的 Mac 上编译。我正在使用 gcc-4.2.1 进行编译。有问题的代码是 C++,它看起来像这样:

void print(std::ostream& os) const { os << std::string(*this) << " "; }

错误是:

error: explicit instantiation of Œstd::basic_ostream<_CharT, _Traits>&
std::operator<<(std::basic_ostream<_CharT, _Traits>&, const
std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits
= std::char_traits<char>, _Alloc = std::allocator<char>]¹ but no
definition available

我知道代码有效,因为它在 Linux 上编译得很好。我无法判断 Mac 错误是由于缺少库还是由于编译器版本不同。我想也许我可以通过自己重载 << 运算符来修复它,但到目前为止我的尝试还没有奏效。任何帮助,将不胜感激!

4

1 回答 1

2

我想也许我可以通过自己重载 << 运算符来修复它,但到目前为止我的尝试还没有奏效

请不要那样做。您需要解决的根本问题是:为什么operator <<不可见的重载?

如果没有某些上下文,很难确切地说出问题所在,但我的猜测是您没有明确包含所有必要的标题。

确保这两个包含都存在:

#include <string>
#include <ostream> // or <iostream> if you need both input and output

也许您在 Linux 上编译时使用的标准库的实现会<string>从头文件中导入头<ostream>文件,反之亦然,因此仅包含这两个头文件中的一个就足够了。

但是,此行为不是标准强制要求的,因此您不能依赖它。始终明确包含所有必要的标头。

于 2013-06-14T14:23:46.287 回答