关于C++模板类运算符重载在类内外实现的不同
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了关于C++模板类运算符重载在类内外实现的不同,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3392字,纯文字阅读大概需要5分钟。
内容图文
![关于C++模板类运算符重载在类内外实现的不同](/upload/InfoBanner/zyjiaocheng/632/3aee437236494d6692ea5a8b9000883e.jpg)
最近在学习c++的模板,起初还挺顺利,但是在模板类遇到了一个IO流重载的问题
首先我是这样写的,但是不能编译
#include<iostream>
using namespace std;
template<typename T>
class A
{
private:
T c;
public:
A(){}
friend ostream& operator<<(ostream& os, const A &a);
friend istream& operator>>(istream& is, A &a);
};
istream & operator>>(istream& is, A& a) //问题出在这里 编译器提示我
{ //缺少 类模板 "A" 的参数列表 ostream 同理
is >> a.c;
return is;
}
ostream & operator<<(ostream& os, const A& a)
{
os << "a: " << a.c << endl;
return os;
}
int main()
{
A<int> a;
cin >> a;
cout << a;
}
按照编译器的提示 我一步一步改成了这样
template<typename T> // 1
istream & operator>>(istream& is, A<T>& a) //2
{
is >> a.c;
return is;
}
template<typename T> //3
ostream & operator<<(ostream& os, const A<T>& a)//4
{
os << "a: " << a.c << endl;
return os;
}
改了四处地方,编译器不给你看波浪线了,但是还是不能运行,编译运行编译器会给你这样报错
Undefined symbols for architecture x86_64:
“operator<<(std::__1::basic_ostream<char, std::__1::char_traits >&, A const&)”, referenced from:
_main in test-0193fd.o
“operator>>(std::__1::basic_istream<char, std::__1::char_traits >&, A&)”, referenced from:
_main in test-0193fd.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
**
但是,我把函数放在类内部实现
**
#include<iostream>
using namespace std;
template<typename T>
class A
{
private:
T c;
public:
A(){}
friend ostream& operator<<(ostream& os, const A<T> &a)
{
os << "a: " << a.c << endl;
return os;
}
friend istream& operator>>(istream& is, A<T> &a)
{
is >> a.c;
return is;
}
};
int main()
{
A<int> a;
cin >> a;
cout << a;
}
然后我发现了一个BUG
#include<iostream>
using namespace std;
template<typename T>
class A
{
private:
T c;
public:
A(){}
friend ostream& operator<<(ostream& os, const A &a) // 这里删掉了<T>
{
os << "a: " << a.c << endl;
return os;
}
friend istream& operator>>(istream& is, A &a) // 这里也是
{
is >> a.c;
return is;
}
};
int main()
{
A<int> a;
cin >> a;
cout << a;
}
发现这样还是可以正常run,总是感觉不对劲,然后我去翻了一下《C++ Primer Plus》书上明确说明这样写是非法的,因为不存在A这样的对象必须要带上< T > 才合法。
最后说一下如何在类外实现IO流重载
找了好多篇博客发现都没有在类外实现IO流重载
有一篇博客解决了这个问题,作者的思路还是比较奇特,不过确实是解决了问题,给大家参考一下
网上搜到的一种解决方法
但是比较麻烦,我们可以有更简便的方法来实现
#include<iostream>
using namespace std;
template<typename T> class A; //前置声明
template <typename T> ostream & operator<<(ostream &os, const A<T> &a);
template <typename T> istream & operator>>(istream &is, A<T> & a);
template<typename T>
class A
{
private:
T c;
public:
A(){}
friend istream& operator>> <T>(istream& is, A<T> &a);
// 这里要加一个<T>
friend ostream& operator<< <T>(ostream& os, const A<T> &a);
//注意用空格将 <<与<T>隔开
};
template<typename T>
istream & operator>> (istream& is, A<T>& a)
{
is >> a.c;
return is;
}
template<typename T>
ostream & operator<< (ostream& os, const A<T>& a)
{
os << "a: " << a.c << endl;
return os;
}
int main()
{
A<int> a;
cin >> a;
cout << a;
}
这样就完美地在类外实现了IO流重载
所有代码都是在Mac下用vscode进行测试,但是经过我使用其他编译器,以及在Windows下测试所得结果一致,应该不会有太大差别。
内容总结
以上是互联网集市为您收集整理的关于C++模板类运算符重载在类内外实现的不同全部内容,希望文章能够帮你解决关于C++模板类运算符重载在类内外实现的不同所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。