[英]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;
}
};
或者,您可以選擇其他選項:
operator<<
模板聲明為朋友(將授予對模板的任何和所有實例的訪問權限),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.