【发布时间】:2012-04-08 02:47:43
【问题描述】:
当我在指针上调用operator<< 时遇到问题。我搜索了 SO 并在 Google 上提出了我的问题,但所有提出的解决方案都没有解决我的问题。为了说明我的问题,请看我的一段简化代码:
Marker.h:
class Marker {
...
public:
friend std::ostream& operator<<(std::ostream& out, const Marker& marker);
friend std::ostream& operator<<(std::ostream& out, Marker* marker);
};
inline std::ostream& operator<<(std::ostream& out, const Marker& marker) {
out << "Marker " << marker._name << " of type " << marker._type << " at position " << marker._position;
return out;
}
inline std::ostream& operator<<(std::ostream& out, Marker* marker) {
out << *marker;
return out;
}
Landmark.h:
class Landmark {
...
Marker* m_marker;
...
};
Landmark.cpp:
void Landmark::print( std::ostream& out )
{
out << "Marker GENERIC: " << m_marker << std::endl;
//out << "Marker GENERIC: " << *m_marker << std::endl;
}
这在 Visual Studio 2008 下没有链接。我收到大量 unresolved external symbol 错误。如果我删除friend std::ostream& operator<<(std::ostream& out, Marker* marker);,代码会编译,但不是预期的格式化输出,我只得到指向标记Marker* Landmark::m_marker 的指针的内存地址。取消注释第二行会使我的代码无法编译。
我应该如何重载operator<< 以获得正确的输出?
如果有任何帮助,我将不胜感激!
【问题讨论】:
-
如果您尝试将
std::ostream& operator<<(std::ostream& out, Marker* marker)定义为它自己的编译单元(即.cpp 文件)中的(非内联)函数,那么这会让链接器满意吗? -
此时编译器不会争论,但包含此 DLL 的项目将无法编译:
unresolved external symbolon functionstd::ostream& operator<<(std::ostream& out, Marker* marker)。这个函数应该在全局命名空间中定义吗?就我而言,我所有的类和重载的运算符函数都位于我的命名空间内。 -
@PavloDyban:它们应在命名空间内,这不是问题。
-
注意:对于指针重载,缺少两件事。它应该是
Marker const* marker,因为Marker实例不会以任何方式发生变异;它应该测试无效性,以防万一,在这种情况下可能输出<null>。
标签: c++ operator-overloading iostream