有关模板的分离编译的问题

yifanaa888 2011-04-30 08:46:48
开发环境:VS2010

问题状况:
Template <class Type> class data;

在data类中声明了有关对<<和>>重载的函数如下:
//friend ostream& operator << (ostream& os, datalist<Type> & arrList);
//friend istream& operator >> (istream& is, datalist<Type> & arrList);

然后这2个友元函数的实现实在一个element.h的头文件中实现的,网上有网友说C++不支持模板的分离编译,把实现放在头文件中就行了,但是现在实现放在头文件中依然不行,依然出现如下问题:
1>main.obj : error LNK2001: unresolved external symbol "class std::basic_istream<char,struct std::char_traits<char> > & __cdecl operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,class datalist<int> &)" (??5@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$datalist@H@@@Z)

个人解决方案:在data类中实现友元函数,但这样不妥,求高手提供分析,提供好的决策!
...全文
174 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
無_1024 2011-04-30
  • 打赏
  • 举报
回复
把你的全部代码贴出来看看 应该不长吧
無_1024 2011-04-30
  • 打赏
  • 举报
回复
全部移到类的外面试一试 友元函数不是类的成员函数
yifanaa888 2011-04-30
  • 打赏
  • 举报
回复
谢谢10楼的了,我放弃了,直接在类里面定义得了,以后项目里再问高手!
yifanaa888 2011-04-30
  • 打赏
  • 举报
回复
这种问题很是郁闷啊,VS2010不行?网上都说可以,╮(╯▽╰)╭
yifanaa888 2011-04-30
  • 打赏
  • 举报
回复
具体实现:
friend ostream& operator << (ostream& os, datalist<Type> & arrList)
{
for(int i=0; i<arrList.size; i++)
{
os << arrList.elements[i];
}
cout << endl;
return os;
}
friend istream& operator >> (istream& is, datalist<Type> & arrList)
{
is >> arrList.size;

for(int i=0; i<arrList.size; i++)
is >> arrList.elements[i];
return is;
}
quwei197874 2011-04-30
  • 打赏
  • 举报
回复
"实现放在头文件中就行了,但是现在实现放在头文件中"这样是对的,你的问题可能是重载函数写的有问题
shaotine_wu 2011-04-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yifanaa888 的回复:]

8楼的你自己能跑通不?我这边加了这3句之后出现了更多问题,小白求教中。。。。。
[/Quote]
看下这个贴
http://topic.csdn.net/u/20110426/07/df254688-3071-4fe1-a687-e96fa52e4d1c.html
yifanaa888 2011-04-30
  • 打赏
  • 举报
回复
8楼的你自己能跑通不?我这边加了这3句之后出现了更多问题,小白求教中。。。。。
shaotine_wu 2011-04-30
  • 打赏
  • 举报
回复
在头文件中加

#ifndef datalist_H_
#define datalist_H_
#include <iostream>

using namespace std;
//加上下面三条语句
class datalist;
ostream& operator << (ostream& os, datalist<Type> & arrList);
istream& operator >> (istream& is, datalist<Type> & arrList);

template <class Type>
class datalist
{
private:
Type* elements;
int size;
void swap(const int, const int);
int maxKey(const int, const int);
public:
datalist(int m=10):size(m),elements(new Type[size]){}
~datalist(){delete [] elements;}
void sort();

//C++中类模板不支持分离编译
friend ostream& operator << (ostream& os, datalist<Type> & arrList);
friend istream& operator >> (istream& is, datalist<Type> & arrList);
};

#endif //datalist_H_
yifanaa888 2011-04-30
  • 打赏
  • 举报
回复
大侠们,source提交上来了,我看是没什么问题,我把友元函数在datalist类中实现后,就能通过编译了,但是楼上的source还是会报错的,╮(╯▽╰)╭

main.obj : error LNK2001: unresolved external symbol "class std::basic_istream<char,struct std::char_traits<char> > & __cdecl operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,class datalist<int> &)" (??5@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$datalist@H@@@Z)

1>main.obj : error LNK2001: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class datalist<int> &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$datalist@H@@@Z)
yifanaa888 2011-04-30
  • 打赏
  • 举报
回复
具体source:
#ifndef datalist_H_
#define datalist_H_
#include <iostream>

using namespace std;

template <class Type>
class datalist
{
private:
Type* elements;
int size;
void swap(const int, const int);
int maxKey(const int, const int);
public:
datalist(int m=10):size(m),elements(new Type[size]){}
~datalist(){delete [] elements;}
void sort();

//C++中类模板不支持分离编译
friend ostream& operator << (ostream& os, datalist<Type> & arrList);
friend istream& operator >> (istream& is, datalist<Type> & arrList);
};

#endif //datalist_H_


#ifndef element_H_
#define element_H_
#include <iostream>
#include "datalist.h"

using namespace std;

//交换数据
template <class Type> void datalist<Type>::swap(const int mark1, const int mark2)
{
Type temp = 0;
temp = elements[mark1];
elements[mark1] = elements[mark2];
elements[mark2] = temp;
}

//查找最大值的位置
template <class Type> int datalist<Type>::maxKey(const int low, const int high)
{
int max = low;
for(int k=low; k<high; k++)
{
if(elements[max] < elements[k])
{
max = k;
}
}
return max;
}

//排序主程序
template <class Type> void datalist<Type>::sort()
{
int index;

for(int i=size-1; i>0; i--)
{
index = maxKey(0,i);
if(index != i)
swap(index,i);
}
}

//重载输出
template <class Type> ostream& operator << (ostream& os, datalist<Type>& arrList)
{
for(int i=0; i<arrList.size; i++)
{
os << arrList.elements[i];
}
cout << endl;

return os;
}

//重载输入
template <class Type> istream& operator >> (istream& is, datalist<Type>& arrList)
{
is >> arrList.size;

for(int i=0; i<arrList.size; i++)
is >> arrList.elements[i];

return is;
}

#endif//element_H_

#include "elements.h"
#include <iostream>

int main()
{
using namespace std;

datalist<int> TestList(10);

cin >> TestList;
cout << TestList;

TestList.sort();

cout << TestList;

cin.get();
cin.get();
cin.get();

return 0;
}

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧