关于模板中的运算符重载
想在模板中实现运算符<<的重载
#include <iostream>
#include <cstring>
using namespace std;
template <typename TType>
ostream &operator <<(ostream &os, TType &a);
template <typename Type>
class Temp
{
private:
Type data;
public:
Temp():data(0){};
Temp(Type a){data = a;};
void Show();
friend ostream & operator <<(ostream &os, Temp<Type> &a);
};
template <typename TType>
ostream &operator <<(ostream &os, TType &a)
{
os << a.data << endl;
return os;
}
template <typename Type>
void Temp<Type>::Show()
{
cout << data << endl;
}
int main()
{
Temp<int> tint(100);
Temp<double> tdouble(11.1);
tint.Show();
tdouble.Show();
cout << tint;
//cout << tdouble;
return 0;
}
提示错误杂没有定义undefined reference to `operator<<(std::ostream&, Temp<int>&)'
求问应该怎么做,谢谢
[最优解释]
#include <iostream>
#include <cstring>
using namespace std;
template <typename TType>
ostream &operator <<(ostream &os, TType &a);
template <typename Type>
class Temp
{
private:
Type data;
public:
Temp():data(0){};
Temp(Type a){data = a;};
void Show();
friend ostream & operator <<(ostream &os, Temp<Type> &a) {
os << a.data << endl;
return os;
}
};
//template <typename TType>
//ostream &operator <<(ostream &os, TType &a)
template <typename Type>
void Temp<Type>::Show()
{
cout << data << endl;
}
int main()
{
Temp<int> tint(100);
Temp<double> tdouble(11.1);
tint.Show();
tdouble.Show();
cout << tint;
//cout << tdouble;
return 0;
}
[其他解释]
#include <iostream>
#include <cstring>
using namespace std;
template <typename Type>
class Temp
{
private:
Type data;
public:
Temp():data(0){};
Temp(Type a){data = a;};
void Show();
friend ostream & operator <<(ostream &os, Temp<Type> &a)
{
os << a.data << endl;
return os;
};
};
template <typename Type>
void Temp<Type>::Show()
{
cout << data << endl;
}
int main()
{
Temp<int> tint(100);
Temp<double> tdouble(11.1);
tint.Show();
tdouble.Show();
cout << tint;
cout << tdouble;
return 0;
}
这样子是可以的 可是怎么把它弄到类外面来定义呢
[其他解释]
我在3L回复了....不知道怎么在引用中修改代码,太乱了,见谅
[其他解释]
#include <iostream>
#include <cstring>
using namespace std;
template <typename TType>
ostream &operator <<(ostream &os, TType &a);
template <typename Type>
class Temp
{
private:
Type data;
public:
Temp():data(0){};
Temp(Type a){data = a;};
void Show();
friend ostream & operator << <>(ostream &os, Temp<Type> &a);
};
template <typename TType>
ostream &operator << <>(ostream &os, TType &a)
{
os << a.data << endl;
return os;
}
template <typename Type>
void Temp<Type>::Show()
{
cout << data << endl;
}
int main()
{
Temp<int> tint(100);
Temp<double> tdouble(11.1);
tint.Show();
tdouble.Show();
cout << tint;
//cout << tdouble;
return 0;
}
[其他解释]
这样也是可以的非约束模板友元函数
#include <iostream>
#include <cstring>
using namespace std;
template <typename Type>
class Temp
{
private:
Type data;
public:
Temp():data(0){};
Temp(Type a){data = a;};
void Show();
template <typename T>
friend ostream & operator <<(ostream &os, T &a);
};
template <typename T>
ostream &operator <<(ostream &os, T &a)
{
os << a.data << endl;
return os;
}
template <typename Type>
void Temp<Type>::Show()
{
cout << data << endl;
}
int main()
{
Temp<int> tint(100);
Temp<double> tdouble(11.1);
tint.Show();
tdouble.Show();
cout << tint;
cout << tdouble;
return 0;
}
就是一开始的那种不会用
[其他解释]
原来是friend ostream & operator << <>(ostream &os, Temp<Type> &a);
少了<>用来指出这事模板具体化
看来我看的不仔细啊
谢谢指教