当前位置: 首页 > 知识库问答 >
问题:

C:好友声明声明非模板函数

庄子平
2023-03-14

我无法使

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

如何解决这个问题?

非常感谢。


共有1个答案

楚冷勋
2023-03-14

在您的代码中有两个不同的问题,第一个是朋友声明(正如警告所说的,可能不太清楚)将一个非模板函数声明为朋友。也就是说,当您实例化模板NVector时

我建议您在类定义中定义friend函数。你可以在这个答案中了解更多。

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

或者,您可以选择其他选项:

  1. 声明运算符

第二个问题是,如果要在左侧参数的类之外定义运算符,则该运算符是自由函数(未绑定到类),因此不应限定它:

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

 类似资料:
  • 本题部分基于加速C++[1]中的练习15-4和那本书中的代码。我想将函数声明为类的朋友,以便它能够访问私有成员。函数被声明为模板,但我不想让所有可能的函数访问私有成员,只允许那些与该类关联的函数访问。 其他文件: 另一个假设的函数可以调用对象的方法,但我希望限制对的私有访问。有没有办法做到这一点,还是我想多了,这种情况在实践中永远不会发生?我应该使用模板专门化吗? [1]Koenig,A.和Moo

  • 我有一个类模板和一个函数模板定义了一个,它引用要绑定到的模板类型。 我想要的是将< code>make_obj函数声明为< code>friend,这样它可以创建< code>Obj的,但是其他人不能(除了通过copy ctor)。 我尝试了几个朋友声明,包括 和 后者是使< code>make_obj的所有模板实例化成为< code>Obj类的朋友的不太理想的尝试。然而,在这两种情况下,我得到相

  • 我有一个全局函数是这样的: 然后在另一个类中,我要将这个函数声明为的朋友。所以我做了: 现在,当我调用时,它无法编译,错误是foo无法访问的私有构造函数。我无法理解该错误,如何正确声明为的朋友? 提前道谢。

  • 模板特化可以被显式声明,这可以作为消除多重实例化的一种方式。例如: #include "MyVector.h" extern template class MyVector<int>; // 消除下面的隐式实例化 // MyVector 类将在“其他地方”被程序员显式实例化 void foo(MyVector<int>& v) { //在这个地方使用vector类型 } 下列代码就是上例

  • 5.1. 函数声明 函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体。 func name(parameter-list) (result-list) { body } 形式参数列表描述了函数的参数名以及参数类型。这些参数作为局部变量,其值由参数调用者提供。返回值列表描述了函数返回值的变量名以及类型。如果函数返回一个无名变量或者没有返回值,返回值列表的括号是可以省略的。如

  • 2.2. 函数声明 2.2.1. Python 和其他编程语言数据类型的比较 与其它大多数语言一样 Python 有函数, 但是它没有像 C++ 一样的独立的头文件;或者像 Pascal 一样的分离的 interface/implementation 段。 一旦需要函数时, 像下面这样声明即可: def buildConnectionString(params): 首先, 函数声明以关键字 de