如何在C++中覆盖模板类>>运算符?



在谷歌上搜索了无数个小时之后,我还是没能找到如何在c++中覆盖模板类的输入操作符。我已经找到了如何覆盖常规类的操作符以及如何覆盖输出操作符的答案。我试图把我从他们那里学到的东西结合起来,结果一无所获。

到目前为止我写的代码是:

类头文件:

#include <iostream>
template <class T>
class Set
{
private:
T **array;
int max;
public:
Set();
Set(int);
~Set();
int Max()
{
return max;
};
friend std::ifstream& operator>> (std::ifstream &input, Set<T> &obj)
{
for (int i = 0; i < obj->max; i++)
{
T a;
input >> a;
obj.array[i] = new T;
obj.array[i] = a;
}
return input;
};
};
template <class T>
Set<T>::Set()
{
max = 0;
array = new T *[max];
}
template <class T>
Set<T>::Set(int a)
{
max = a;
array = new T *[max];
}
template <class T>
Set<T>::~Set()
{
delete[] array;
}

主程序:

#include "set.hpp"
int main(){
Set<float> obj;
std::cin >> obj;
return 0;
}

当尝试编译时,我得到以下两个错误:

no match for 'operator>>' (operand types are 'std::istream' {aka 'std::basic_istream<char>'} and 'Set<float>')
no operator ">>" matches these operands -- operand types are: std::istream >> Set<float>

如果它是重要的,我使用gcc编译器。谢谢你!

你可以这样重载:

template <class T>
class Set
{
...
template<typename U>
friend std::istream& operator>> (std::istream &input, Set<U> &obj);
};
template<typename T>
std::istream& operator>> (std::istream &input, Set<T> &obj)
{
...
return input;
}

可以在类中定义:

template <class T>
class Set
{
...
friend std::istream& operator>> (std::istream &input, Set<T> &obj)
{
return input
}
}

在第一个例子中,你声明我的朋友operator >>实例是set<>模板class的一个实例的朋友。在第二个示例中,我们内联了friend函数,只允许好友operator >>的一个实例成为set<>的一个实例的朋友

这里有一个更好的答案SO,这与operator <<有关。如果OP能从链接的答案中得到更好的想法,我可以删除我的答案。

最新更新