2016-05-03 37 views
0

我有一個(VC++ 2013)DLL,編譯精細限定的<<操作過載:鏈接誤差ostream的操作過載(VC++ 2013)

定義:

__declspec(dllexport) friend std::ostream& operator<< (std::ostream& os, const ComplexMessage& rhs); 

實現:

std::ostream& operator<< (std::ostream& os, const ComplexMessage& rhs) 
{ 
    os << rhs.toString(); 
    return(os); 
} 

該dll包含另外50個方法,包括多個運算符重載,這些重載編譯並鏈接正常。

但是,使用該DLL的程序無法鏈接方法< <。

它聲明過載<<作爲

__declspec(dllimport) std::ostream& operator<< (std::ostream& os, const ComplexMessage& rhs); 

代碼編譯細。但它不會鏈接:

錯誤LNK2001:無法解析的外部符號「__declspec(dllimport的)類 的std :: basic_ostream> & __cdecl 消息::運算< <(類的std :: basic_ostream> &,類messaging :: ComplexMessage const &)「

所有其他DLL方法鏈接正常。有誰知道爲什麼這個鏈接器錯誤發生?

編輯 這與提出的重複問題不同。這些符號在DLL的代碼中定義並在語法上編譯;但是,它沒有鏈接。這向我暗示,該特定運算符的代碼不是正在生成,或者正在生成但未正確找到。我確定這很簡單,但是我一直在爲這個問題敲響頭。

+0

可能重複[什麼是未定義的引用/無法解析的外部符號錯誤,以及如何解決它?](http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-如果在兩個位置指定了未命名的命名空間「:: operator <<」, –

+0

可能會捕獲某些內容。這是我看到的一個問題是名稱空間中的原型,而另一個/無定義。這不會導致編譯錯誤。 (可能會發出警告,你是否篩選了所有的警告?)要清楚,這不會解決它,但可能有助於診斷它。 – Jfevold

+0

使用.h文件聲明導出的函數。這樣你就不會意外地使用錯誤的名稱空間名稱。水晶球說它沒有在消息*中定義。 –

回答

1

由於它上面的輸入被確定的解決方案是明確指定在執行命名空間(不是定義):

std::ostream& messaging::operator<< (std::ostream& os, const ComplexMessage& rhs); 

注意,具有「使用命名空間的消息」一語是沒有效果;鏈接器要求在實現聲明中明確指定。