[英]Unresolved external symbol for friend function
首先是我的代碼布局:
啊
class STORAGE_CLASS_DECLARATOR A : public PureVirtual
{
some member functions, all working;
void someFunctionCallingOperator<<();
friend std::ostream& operator << (std::ostream &, A *);
}
A.cpp
std::ostream& operator << (std::ostream & out, A * a){...}
void A::someFunctionCallingOperator<<(){...}
其中Storage_xxx_declarators是declspec的宏。 我已經嘗試了有和沒有聲明者的朋友功能無濟於事。
我在運算符<< function上得到一個未解析的外部符號。
根據我的理解,這可能是由於:
我意識到鏈接是一個單獨的階段,我必須做一些非常簡單的錯誤,但我現在已經凝視了一段時間,並且無法從理論上推斷出為什么會發生這種情況,所以我求助於SO尋求幫助
謝謝你,AK
根據您的評論,我假設您的設置是這樣的:
啊
namespace NN {
class STORAGE_CLASS_DECLARATOR A : public PureVirtual
{
some member functions, all working;
void someFunctionCallingOperator<<();
friend std::ostream& operator << (std::ostream &, A *);
}
}
A.cpp:
using namespace NN;
std::ostream& operator << (std::ostream & out, A * a){...}
void A::someFunctionCallingOperator<<(){...}
這是一個非常常見的設置,但我不鼓勵任何人使用它,因為它會導致你現在所擁有的類型的問題。 讓我們來看看A.cpp
發生了A.cpp
:
在解析A::someFunctionCallingOperator
的定義時,全局命名空間中沒有A
,因此using
-ed命名空間,並將A
解析為NN::A
但是,在解析operator<<
的定義時,什么都沒有表明應該將運算符放入名稱空間NN
。 所以這很愉快地定義了全局命名空間中的operator<<
,它與Ah
的朋友聲明引入的NN::operator<<
沒有任何關系。 稍后,當你使用<<
inside someFunctionCallingOperator
, NN::operator<<
(已經在Ah
聲明)是通過參數依賴查找找到的,所以它被使用了。 最后,鏈接器正在抱怨它從未定義過。
解決這個問題的正確方法是停止在A.cpp
using namespace NN
並將內容正確地包含在名稱空間中,就像在頭文件中一樣:
namespace NN {
std::ostream& operator << (std::ostream & out, A * a){...}
void A::someFunctionCallingOperator<<(){...}
}
簡短回答:確保操作員的返回類型和參數在定義和實現方面都是相同的。
答案稍長一點:
您似乎省略了運算符的返回類型。 您的朋友函數定義包含您的宏,但實現標識了ostream&
的返回類型。 如果ostream&
未包含在宏中,則可能導致未解決的外部符號錯誤。
您還省略了實現中的參數,如果您嘗試將運算符與參數一起使用(這對於<<
正常情況),也會導致未解析的外部符號錯誤。 編譯器將查找<<
使用單個參數(以及ostream&
返回類型)的operator<<
實現',但只會找到帶有空參數列表的operator<<
的實現。
我通過將該方法放在同一名稱空間中解決了這個問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.