簡體   English   中英

C++:友元聲明'聲明一個非模板函數

[英]C++ : friend declaration ‘declares a non-template function

我在重載<<流運算符時遇到問題,但找不到解決方案:

template<class T, unsigned int TN>
class NVector
{
    inline friend std::ostream& operator<< (
        std::ostream &lhs, const NVector<T, TN> &rhs);
};

template<class T, unsigned int TN>
inline std::ostream& NVector<T, TN>::operator<<(
    std::ostream &lhs, const NVector<T, TN> &rhs)
{
    /* SOMETHING */
    return lhs;
};

它產生以下錯誤消息:

警告:友元聲明 'std::ostream& operator<<(std::ostream&, const NVector&)' 聲明了一個非模板函數 [-Wnon-template-friend]

錯誤:'std::ostream& NVector::operator<<(std::ostream&, const NVector&)' 必須只采用一個參數

如何解決這個問題?

非常感謝你。

您的代碼中有兩個不同的問題,第一個是friend聲明(正如警告明確指出的,可能不太清楚)將單個非模板化函數聲明為友元。 也就是說,當您實例化模板NVector<int,5>它將非模板化函數std::ostream& operator<<(std::ostream&,NVector<int,5>)為友元。 請注意,這與聲明您作為朋友提供的模板函數不同。

我建議您在類定義中定義友元函數。 您可以在此答案中閱讀有關此內容的更多信息。

template <typename T, unsigned int TN>
class NVector {
   friend std::ostream& operator<<( std::ostream& o, NVector const & v ) {
      // code goes here
      return o;
   }
};

或者,您可以選擇其他選項:

  1. operator<<模板聲明為朋友(將授予對模板的任何和所有實例的訪問權限),
  2. 將該模板的特定實例聲明為朋友(編寫起來更麻煩)或
  3. 完全避免友誼,提供公共print( std::ostream& )成員函數並從非友模板operator<<調用它。 我仍然會選擇與非模板函數交朋友,並在模板化類中提供定義。

第二個問題是,當您想在左側參數的類之外定義一個運算符時,該運算符是一個自由函數(未綁定到類),因此不應對其進行限定:

template<class T, unsigned int TN>
inline std::ostream& operator<<(std::ostream &lhs, const NVector<T, TN> &rhs)
{
    /* SOMETHING */
    return lhs;
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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