如何将输出运算符 (<<) 覆盖为 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;
}
我正在阅读《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;
}