模板类与非模板类中将重载操作符函数作为友元函数的区别
来源:互联网 发布:access数据库教程视频 编辑:程序博客网 时间:2024/05/22 15:30
今天编程中遇到的问题,花了一个多小时才找出错因
代码
#include<iostream>using namespace std;template<class T>class A{friend ostream& operator << (ostream& out,const A<T>& m);public:A(T c):a(c){}T a;};template<class T>ostream& operator << (ostream& out,const A<T>& m){out<<m.a<<endl;return out;}int main(){A<int> test(2);cout<<test;return 0;}这样声明和定义模板友元函数 编译器会报错!!!
undefined reference to `operator<<(std::ostream&, A<int> const&)'
函数没有被实例化
一个简单是解决方法是把函数声明与定义都放在类体中
#include<iostream>using namespace std;template<class T>class A{friend ostream& operator << (ostream& out,const A<T>& m){out<<m.a<<endl;return out;}public:A(T c):a(c){}T a;};int main(){A<int> test(2);cout<<test;return 0;}另一种复杂的解决方式是先对模板类和友元函数进行全局声明
#include<iostream>using namespace std;template <class T>class A; template <class T>ostream& operator <<(ostream& out,const A<T>& m);template <class T>class A{friend ostream& operator << <>(ostream& out,const A& m);public:A(int c):a(c){}int a;};template <class T>ostream& operator << (ostream& out,const A<T>& m){out<<m.a<<endl;return out;}int main(){A<int> test(2);cout<<test;return 0;}
这样能正常运行 输出2
注意在模板类中函数operator << 后添加了<>说明我们需要的是T形参的operator <<
注:<T>其中的T可有可无
在非模板类中的友元函数operator<<
#include<iostream>using namespace std;class A{friend ostream& operator << (ostream& out,const A& m);public:A(int c):a(c){}int a;};ostream& operator << (ostream& out,const A& m){out<<m.a<<endl;return out;}int main(){A test(2);cout<<test;return 0;}能正常输出2,因为函数已经实例化
1 0
- 模板类与非模板类中将重载操作符函数作为友元函数的区别
- C++模板类与运算符作为友元函数重载
- 运算符重载函数作为类成员函数与友元函数的区别
- 模板类的非模板友元函数
- 模板类的非约束模板友元函数
- 模板类与类模板的区别以及模板类的友元重载
- 模板类的友元模板函数
- 模板类的 友元模板函数
- 函数重载与函数模板的区别
- 模板--函数模板与函数模板,类模板与模板类,重载模板函数
- 函数模板与类模板的区别
- 函数模板与类模板的区别
- 函数模板与类模板的区别
- 函数模板与类模板的区别
- 函数模板与类模板的区别
- 函数模板与类模板的区别
- 函数模板与类模板的区别
- 类模板与输出函数的重载
- android studio编译项目时出错
- Log4J和slf4j的debug日志问题
- Java JDK Integer Cache
- 《C++编程风格》第一章:抽象
- Vertica的这些事<三>—— 谈谈vertica的flex table
- 模板类与非模板类中将重载操作符函数作为友元函数的区别
- java之封装 Encapsulation
- http 常 用 状 态 码
- 常用验证片段
- scala 基本语法—4
- NOI2016.7.12模拟赛总结
- 加载.so库时UnsatisfiedLinkError异常的一个原因
- Flume
- 自我介绍