读书人

关于模板中的运算符重载,该怎么处理

发布时间: 2012-12-16 12:02:32 作者: rapoo

关于模板中的运算符重载
想在模板中实现运算符<<的重载


#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;
}



这样子是可以的 可是怎么把它弄到类外面来定义呢
[其他解释]
引用:
C/C++ code??123456789101112131415161718192021222324252627282930313233343536373839404142434445464748#include <iostream>#include <cstring>using namespace std; template <typename TType>ostr……


我在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);
少了<>用来指出这事模板具体化
看来我看的不仔细啊

谢谢指教

读书人网 >C++

热点推荐