在“函数名”运算符后面输入参数<T>
Type parameter <T> behind the “function name” operator
以下两个片段有什么区别?
- with
<T>
for operator <<
template<typename T>
class Stack {
...
friend std::ostream& operator<< <T> (std::ostream&,
Stack<T> const&);
};
- 没有
<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>
将帮助它。如果没有找到这样的函数,则声明该函数(但这是一个有问题的情况,因为没有办法通用地定义它)。
以下两个片段有什么区别?
- with
<T>
for operator <<
template<typename T>
class Stack {
...
friend std::ostream& operator<< <T> (std::ostream&,
Stack<T> const&);
};
- 没有
<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>
将帮助它。如果没有找到这样的函数,则声明该函数(但这是一个有问题的情况,因为没有办法通用地定义它)。