我在指针上调用operator<<
时遇到问题。我已经通过搜索并在Google上提出了我的问题,但所有提出的解决方案都无法解决我的问题。为了说明我的问题,请参见简化一块我的代码:已重载的std :: ostream运算符<<未调用,流获取变量地址而不是对象
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<<
以便我得到正确的输出?
我将不胜感激任何帮助!
注:为指针过载,两件事情失踪。它应该读取'Marker const * marker',因为'Marker'实例没有任何突变;它应该测试无效,以防万一,在这种情况下可能输出''。 –
2012-03-23 15:29:16
如果您尝试在其自己的编译单元(即在.cpp文件中)中定义'std :: ostream&operator <<(std :: ostream&out,Marker * marker)'作为(非内联)函数,这使链接器开心? – 2012-03-23 14:34:18
然后编译器并不争论,但包含此DLL的项目无法编译:函数std :: ostream&operator <<(std :: ostream&out,Marker * marker)上的'unresolved external symbol''。这个函数是否应该在全局命名空间中定义?就我而言,我所有的类和重载的运算符函数都位于我的名字空间内。 – 2012-03-23 14:45:29