gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:07:51 28 4
gpt4 key购买 nike

我在重载 << 时遇到问题流运算符(operator),我找不到解决方案:

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;
};

它产生以下错误信息:

warning : friend declaration ‘std::ostream& operator<<(std::ostream&, const NVector&)’ declares a non-template function [-Wnon-template-friend]

error: ‘std::ostream& NVector::operator<<(std::ostream&, const NVector&)’ must take exactly one argument

如何解决这个问题?

非常感谢。

最佳答案

您的代码中有两个不同的问题,第一个是 friend声明(正如警告中明确指出的那样,可能理解起来不是很清楚)将单个非模板化函数声明为友元。也就是说,当你实例化模板时 NVector<int,5>它声明了一个非模板函数 std::ostream& operator<<(std::ostream&,NVector<int,5>)作为一个 friend 。请注意,这与声明您作为 friend 提供的模板函数不同。

我建议您在类定义中定义友元函数。您可以在此 answer 中阅读更多相关信息.

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<<模板作为 friend (将授予对模板的任何和所有实例的访问权限),
  2. 将该模板的特定实例声明为友元(编写起来更麻烦)或
  3. 完全避免提供公共(public)友元print( std::ostream& )成员函数并从非 friend 模板化调用它 operator<< .我仍然会选择与非模板函数成为 friend ,并在模板类中提供定义。

第二个问题是,当您想在左侧参数的类之外定义一个运算符时,该运算符是一个自由函数(未绑定(bind)到类),因此它应该不合格:

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,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10787655/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com