簡體   English   中英

嘗試重載<<運算符並使用Friend函數時發生錯誤

[英]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.

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