[英]error when trying to overload << operator and using friend function
我試圖重載<<運算符,並使用朋友功能。 下面的代碼塊工作正常。
template <class T>
class Mystack{
friend std::ostream& operator<<(std::ostream& s, Mystack<T> const& d)
{
d.print(s);
return s;
}
};
由於它是朋友函數,我顯然希望在類之外定義它而不使用范圍解析運算符。 但是當我嘗試時,我得到了錯誤。
template <class T>
class Mystack{
friend std::ostream& operator<<(std::ostream& s, Mystack<T> const& d);
};
template <class T>
std::ostream& operator<<(std::ostream& s, Mystack<T> const& d)
{
d.print(s);
return s;
}
以下是main的代碼段
Mystack<int> intstack;
std::cout << intstack;
錯誤 :外部符號未解析。
PS:它不是完整的運行代碼。 只是一個樣本。 請忍受。
friend std::ostream& operator<<(std::ostream& s, Mystack<T> const& d);
聲明非模板operator<<
函數並與之成為朋友。 因此Mystack<int>
將具有一個非模板函數std::ostream& operator<<(std::ostream& s, Mystack<int> const& d);
作為其朋友std::ostream& operator<<(std::ostream& s, Mystack<int> const& d);
等
template<class T>
std::ostream& operator<<(std::ostream& s, Mystack<T> const& d)
{
d.print(s);
return s;
}
定義一個operator<<
功能模板。
兩者不一樣。 當你寫std::cout << intstack;
,重載解析規則會將其解析為您聲明的非模板operator<<
函數,但未定義該函數,因此會出現鏈接器錯誤。
無法為類模板之外的每個類模板實例化定義非模板函數。 但是,您可以成為您的operator<<
功能模板的專業人士的朋友:
// forward declarations
template <class T>
class Mystack;
template <class T>
std::ostream& operator<<(std::ostream& s, Mystack<T> const& d);
template <class T>
class Mystack
{
friend std::ostream& operator<< <T>(std::ostream& s, Mystack<T> const& d);
// ^^^
};
或與功能模板的每個專業化做朋友,這從封裝的角度來看更糟(因為,例如, operator<< <int>
將是Mystack<float>
的朋友):
template <class T>
class Mystack
{
public:
template <class U>
friend std::ostream& operator<<(std::ostream& s, Mystack<U> const& d);
};
或者只是在類中定義friend函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.