基于模板参数的友元重载opearto<<常见问题
来源:互联网 发布:网络捕鱼客服犯法吗 编辑:程序博客网 时间:2024/05/08 21:09
对于模板下的类定义,一般重载operator<<()用来输出类内部的信息:
我们习惯性写法:
template<typename T>class A{public: A(string value): data(value){} friend ostream& operator<< (ostream & out, const A<T>& me);private: T data;}; template<typename T>ostream& operator<< (ostream & out, const A<T>& me){ cout << me.data << endl; return out;}
GCC编译器警告:
TemplateFriendFunction.cpp:14: warning: friend declaration ‘std::ostream& operator<<(std::ostream&, const A<T>&)’ declares a non-template functionTemplateFriendFunction.cpp:14: note: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here)出现问题的原因:定义的友元函数还是一个模版,要实例化为参数变元后才能使用
解决方法有两种:(1)把友元函数体放到类声明内部,使其跟着类的实例化一同实例化:
template<typename T>class A{public: A(string value): data(value){} friend ostream& operator<< (ostream & out, const A<T>& me) { cout << me.data << endl; return out; }private: T data;};方法(2)把友元模版放到类模版声明之上,同样在类模版参数化时附带把友元函数参数化:
template<typename T>class A{public: A(string value): data(value){} friend ostream& operator<< <>(ostream & out, const A<T>& me);private: T data;}; template<typename T>ostream& operator<< (ostream & out, const A<T>& me){ cout << me.data << endl; return out;}
注意在函数名后加上<>
0 0
- 基于模板参数的友元重载opearto<<常见问题
- 模板类的友元重载
- 模板类的友元重载(<>)
- 模板类的友元重载
- 模板类的友元重载
- 模板类的友元重载,用C++代码实现
- C++中模板类的友元重载
- 模板类与类模板的区别以及模板类的友元重载
- C++友元重载运算符,模板类友元重载
- c++模板元编程模板的模板参数
- 带模板参数的运算符重载
- 函数模板和友元重载运算符报"无法解析的外部符"的解决方法
- C++_模板类的友元运算符重载_原理
- C++_模板类的友元运算符重载_原理
- C#方法重载-基于不同类型的参数的方法重载
- 模板类与非模板类中将重载操作符函数作为友元函数的区别
- 友元继承、<模板类、重载操作符>
- 基于c++的运算符重载(一、复数非友元+友元)
- json数据和xml数据有什么不同?
- 302_ViewStub用法
- 离散傅里叶变换
- Date,SimpleDateFormat,Calendar的使用
- 303_二维码功能实现
- 基于模板参数的友元重载opearto<<常见问题
- 【POJ】1002. 487-3279
- Foxit Mobile PDF SDK for Android_初识(1)
- STM32之BKP后备域库函数介绍
- 常见的三个光照模型:Lambert,Phong,BlinnPhong
- 304_根据字符串获取资源id
- Android中极简的js与java的交互库-SimpleJavaJsBridge
- C++ 用libcurl库进行http通讯网络编程
- Java设计模式之 —— 装饰者(Decorator) — 点炒饭