我在指針上調用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