在“函数名称”操作符后面输入参数 <T>

Wil*_*lli 4 c++ class-template

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

  1. 使用<T>for 运算符 <<
template<typename T>
class Stack {
...
friend std::ostream& operator<< <T> (std::ostream&,
Stack<T> const&);
};
Run Code Online (Sandbox Code Playgroud)
  1. 没有 <T>
template<typename T>
class Stack {
...
friend std::ostream& operator<< (std::ostream&,
Stack<T> const&);
};
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 7

在#1,编译器会查找调用的函数模板operator<<,从而operator<< <T>给了精确的签名,以及类Stack<T>将只交好特定专业化。

在#2 中,编译器将查找具有给定精确签名的非模板函数operator<<。如果找到了这样的功能,Stack<T>就会和它成为朋友。如果找不到这样的函数,则声明该函数(但这是一个有问题的情况,因为没有办法对它进行一般定义)。