簡體   English   中英

朋友功能的未解析外部符號

[英]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上得到一個未解析的外部符號。

根據我的理解,這可能是由於:

  1. 沒有函數的主體,這顯然不正確,因為文件肯定被解析為其他功能,這是正常的。
  2. 符號未正確導出。 同樣,我不知道這是怎么發生的,並且在實際情況中,operator << for A這里實際上為另一個類B調用operator <<,並且還為該函數顯示了相同的錯誤。 因此,必須在某個時刻解析A的定義。

我意識到鏈接是一個單獨的階段,我必須做一些非常簡單的錯誤,但我現在已經凝視了一段時間,並且無法從理論上推斷出為什么會發生這種情況,所以我求助於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 someFunctionCallingOperatorNN::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM