重载 << 和 >> 作为模板的外部成员函数 class

Overloading << and >> as outside member functions for template class

我正在尝试在 class 之外定义我的运算符重载,如下所示:

template <typename Type>
class myClass
{
    ...
    friend std::ostream& operator << (std::ostream&, const myClass&);
    friend std::istream& operator >> (std::istream&, myClass&);
    ...
}

template <typename Type>
std::ostream& myClass<Type> :: operator << (std::ostream& out, const myClass<Type>& other) { ... }

template <typename Type>
std::istream& myClass<Type> :: operator >> (std::istream& in, myClass<Type>& other) { ... }

我的问题是我收到类似“class 模板 class 没有成员 operator<<" 我不明白这是怎么发生的,为什么会发生。

首先,友元函数不是 class 的成员函数。

所以这些声明在任何情况下都是不正确的。

template <typename Type>
std::ostream& myClass<Type> :: operator << (std::ostream& out, const myClass<Type>& other) { ... }

template <typename Type>
std::istream& myClass<Type> :: operator >> (std::istream& in, myClass<Type>& other) { ... } 

其次,您在 class 定义中声明了非模板友元函数。

要么您需要在 class 定义中提供它们的定义。或者对于 class 的每个潜在模板参数,您必须在 class.

之外定义友元函数

这是一个演示程序,展示了如何在 class 模板定义中定义非模板友元函数。

#include <iostream>

template <typename T>
class A
{
private:
    T t;

public:
    A( const T &t ) : t( t ) {}

    friend std::ostream &operator <<( std::ostream &os, const A &a )
    {
        return os << a.t;
    }
};


int main()
{
    std::cout << A<int>( 10 ) << '\n';
    std::cout << A<const char *>( "Hello" ) << '\n';
}

程序输出为

10
Hello

这里有一个演示程序,展示了如何在 class 模板定义之外定义友元函数。也就是说,对于每个使用的 class 模板特化,您需要定义非模板友元函数。

#include <iostream>

template <typename T>
class A
{
private:
    T t;

public:
    A( const T &t ) : t( t ) {}

    friend std::ostream &operator <<( std::ostream &os, const A &a );
};


std::ostream &operator <<( std::ostream &os, const A<int> &a )
{
    return os << a.t;
}

std::ostream &operator <<( std::ostream &os, const A<const char *> &a )
{
    return os << a.t;
}

int main()
{
    std::cout << A<int>( 10 ) << '\n';
    std::cout << A<const char *>( "Hello" ) << '\n';
}

另一种方法是声明模板友元函数。例如

#include <iostream>

template <typename T>
class A
{
private:
    T t;

public:
    A( const T &t ) : t( t ) {}

    template <typename T>
    friend std::ostream &operator <<( std::ostream &os, const A<T> &a );
};

template <typename T>
std::ostream &operator <<( std::ostream &os, const A<T> &a )
{
    return os << a.t;
}

int main()
{
    std::cout << A<int>( 10 ) << '\n';
    std::cout << A<const char *>( "Hello" ) << '\n';
}