C++模板类友元operator<<声明带<T>与不带<T>的区别
两段C++代码的核心差异
这两段都是类模板Stack对operator<<的友元声明,核心区别在于声明的友元是不是模板函数的实例:
1. 带<T>的版本
声明的是模板函数operator<<的对应类型实例作为友元。
- 前置要求:必须在
Stack类模板定义之前,提前声明operator<<的模板,否则编译器找不到对应的模板实例,直接报错。正确的完整前置声明写法如下:
template<typename T> class Stack; template<typename T> std::ostream& operator<<(std::ostream&, Stack<T> const&);
- 优势:只需要在类外实现一次
operator<<模板,所有类型的Stack<T>实例都可以共用这套实现,不会出现链接找不到符号的问题。
2. 不带<T>的版本
声明的是非模板的普通独立函数作为友元。
- 没有前置声明模板的要求,编译器会默认:每实例化一个具体的
Stack<某类型>,就存在一个单独的、对应该类型的非模板operator<<函数。 - 弊端:如果不在类内部直接写
operator<<的实现,而是想放到类外实现的话,必须手动给每个用到的Stack的模板参数类型都写一遍对应的operator<<实现,否则链接时会找不到对应函数的符号,因为它不会像模板一样自动生成对应类型的实现。
内容的提问来源于stack exchange,提问作者Willi
相关产品推荐
相关产品推荐

