C ++:friend声明“声明一个非模板函数(C++ : friend declaration ‘

2019-06-24 21:30发布

我有一个问题重载<<流运算符,我没有找到解决办法:

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的和运营商<<(STD :: ostream的和,常量NVector&)' 声明一个非模板函数[-Wnon模板,朋友]

错误: '的std :: ostream的和NVector ::运算符<<(STD :: ostream的和,常量NVector&)' 必须只有一个参数

如何解决这个问题?

非常感谢你。

Answer 1:

有在你的代码两个不同的问题,第一个是在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;
};


文章来源: C++ : friend declaration ‘declares a non-template function