在“函数名”运算符后面输入参数<T>

Type parameter <T> behind the “function name” operator

以下两个片段有什么区别?

  1. with <T> for operator <<
template<typename T>
class Stack {
...
friend std::ostream& operator<< <T> (std::ostream&,
Stack<T> const&);
};
  1. 没有<T>
template<typename T>
class Stack {
...
friend std::ostream& operator<< (std::ostream&,
Stack<T> const&);
};

在 #1 中,编译器将寻找一个名为 operator<< 的函数模板,这样 operator<< <T> 具有给定的精确签名,并且 class Stack<T> 将成为朋友只有那个特定的专业。

在#2 中,编译器将寻找一个名为 operator<< 非模板 函数,它具有给定的精确签名。如果找到这样的函数,Stack<T> 将帮助它。如果没有找到这样的函数,则声明该函数(但这是一个有问题的情况,因为没有办法通用地定义它)。