如何将输出运算符 (<<) 覆盖为 class 模板外的函数模板

How to override output operator (<<) as a function template outside a class template

我正在阅读《C++ 模板,完整指南》一书的第 2.4 节。

我试图将输出运算符 (<<) 覆盖为 函数模板 class 模板 [=12] =].

下面是我的代码,但它不起作用。

#include <iostream>
#include <string>
#include <vector>

template<class T>
class Stack
{
    private:
    std::vector<T> v;

    public:
    void  push(T a);
    void  printOn(std::ostream & os) const;

    template <typename U>
    friend std::ostream& operator<< (std::ostream& out, const Stack<U> & s);

};      

template<typename T>
std::ostream& operator<< (std::ostream out, const Stack<T> & s)
{                                                        
    s.printOn(out);
    return out;
}

template<class T>
void Stack<T>::push(T a)
{                                
    v.push_back(a);               
}

template<class T>
void Stack<T>::printOn(std::ostream & out) const
{                               
    for(T const & vi : v)
    {out << vi << " ";} 
}

int main()
{
    Stack<int> s1;
    s1.push(12);
    s1.push(34);
    std::cout << s1;
}


你只是省略了 &,这使得 class 内部和外部的 operator<< 具有不同的函数签名,它们都对 std::cout << s1 有效,因此歧义

template<typename T>
std::ostream& operator<< (std::ostream& out, const Stack<T> & s)
                                   // ^
{                                                        
    s.printOn(out);
    return out;
}