关于模板类的一个错误 帮我改过来啊!!

operatingtuzi 2008-12-18 09:59:13
一个习题,要求是这样的:
elements数组中从下标0到currentsize存放可检索的数组,其中下标0中存放的是要搜索的数据
如果找到就返回下标,没找到就返回0
以下提供完整程序

#include<iostream>
using namespace std;

template<class T>
class list;

template<class T>
class node
{
private:
T key;
public:
node(){}
node(T k):key(k){}
friend class list< T >;
};

template <class T>
class list
{
private:
T *element;
int maxsize,currentsize;
public:
list(int ms):maxsize(ms),currentsize(0){element=new node<T>[maxsize+1];}
friend ostream& operator <<(ostream& os,const list<T>& l);
friend istream& operator>>(istream& is,const list<T>& l);
int serch(const T& x)
{
element[0].key=x;int i=currentsize;
while(element[i].key!=x)i--;
for(int i=1;i<=currentsize;i++)
return i;
}
};
template<class T>
ostream& operator <<(ostream& os,const list<T>& l)
{
os<<"the elements are"<<endl;
for(int i=1;i<=l.currentsize;i++)
{
os<<l.element[i].key<<" ";
}
return os;
}

template<class T>
istream& operator >>(istream& is,const list<T>& l)
{
cout<<"please input the number"<<endl;
is>>l.currentsize;
cout<<"input the element"<<endl;
for(int i=1;i<=element.currentsize;i++)
{
in>>elementp[i].key;
}
return in;
}

void main()
{
list<float> l(10); //这里有错!!!
cin>>l;
cout<<l;
}

我编译的时候有一个错误,说不能从float转换成T
大家说说怎么回事呀
...全文
134 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
myoswin7 2008-12-21
  • 打赏
  • 举报
回复
好好看看《C++ Primer》吧
operatingtuzi 2008-12-19
  • 打赏
  • 举报
回复
新版本

#include<iostream>
using namespace std;

template<class T>
class list;

template<class T>
class node
{
private:
T key;
public:
node(){}
node(T k):key(k){}
friend class list< T >;
T getkey(){return key;}
void setkey(T k){key=k;}
};

template <class T>
class list
{
private:
node<T> *element;
int maxsize,currentsize;
public:
list(int ms):maxsize(ms),currentsize(0){element=new node<T>[maxsize+1];}
friend ostream& operator <<<>(ostream& os,const list<T>& l); //////// error here
friend istream& operator>>(istream& is,list<T>& l); //////// error here
int serch(const T& x)
{
element[0].key=x;int i=currentsize;
while(element[i].key!=x)i--;
for(int i=1;i<=currentsize;i++)
return i;
}
};
template<class T>
ostream& operator <<<>(ostream& os,const list<T>& l)
{
os<<"the elements are"<<endl;
for(int i=1;i<=l.currentsize;i++)
{
os<<l.element[i].getkey()<<" ";
}
return os;
}

template<class T>
istream& operator >>(istream& is,const list<T>& l)
{
cout<<"please input the number"<<endl;
is>>l.currentsize;
cout<<"input the element"<<endl;
for(int i=1;i<=element.currentsize;i++)
{
T x;
is>>x;
elementp[i].setkey(x);
}
return is;
}

void main()
{
list<float> l(10);
cin>>l;
cout<<l;
}
operatingtuzi 2008-12-19
  • 打赏
  • 举报
回复
对楼上回答仍有不解
[Quote=引用 3 楼 nineforever 的回复:]
你的程序有如下几处错误:
1.友元声明
如果你需要声明模板函数的实例为友元,需要使用下述语法
friend ostream& operator < < <>(ostream& os,const list& l);
不解 为什么要加<>,不过实际上加了也是那两个链接错误
2.访问权限
Node.key是private成员,无法在operator < <中访问(只有在友元list <T>里能够访问)
已修正3.模板实现
你很多地方忘记加l.或者错用了
哪里?4.operator>>的第二个参数不能是const &,因为你要输入修改它的内容
已修正
5.逻辑错误
你在operator>>中没有配element就直接读入数据了
在构造函数中就已经分配完了
[/Quote]

还是那两个链接错误 继续期待高人
nineforever 2008-12-19
  • 打赏
  • 举报
回复
你的程序有如下几处错误:
1.友元声明
如果你需要声明模板函数的实例为友元,需要使用下述语法
friend ostream& operator << <>(ostream& os,const list& l);
2.访问权限
Node.key是private成员,无法在operator<<中访问(只有在友元list<T>里能够访问)
3.模板实现
你很多地方忘记加l.或者错用了
4.operator>>的第二个参数不能是const &,因为你要输入修改它的内容
5.逻辑错误
你在operator>>中没有分配element就直接读入数据了
nineforever 2008-12-19
  • 打赏
  • 举报
回复
加<>表明你的友元函数是模板函数

友元声明
friend ostream& operator<< <>(ostream& os,const list<T>& l);
friend istream& operator>> <>(istream& is,list<T>& l);

定义
ostream& operator <<(ostream& os,const list<T>& l)
istream& operator >>(istream& is,list<T>& l)

你的operator>>里的实现是错的,你比较一下代码就知道了。
你在构造函数里分配了内存,但是operator>>输入的currentsize可能大于10,这时就会有问题了。所以你应当重新分配

另外不要用VC6这种古老的编译器了,main必须返回int的
PS:你search拼错了


#include<iostream>
using namespace std;

template<class T>
class list;

template<class T>
class node
{
private:
T key;
public:
node(){}
node(T k):key(k){}
friend class list< T >;
T getkey(){return key;}
void setkey(T k){key=k;}
};

template <class T>
class list
{
private:
node<T> *element;
int maxsize,currentsize;
public:
list(int ms):maxsize(ms),currentsize(0){element=new node<T>[maxsize+1];}
friend ostream& operator << <>(ostream& os,const list<T>& l); //////// error here
friend istream& operator>> <>(istream& is,list<T>& l); //////// error here
int serch(const T& x)
{
element[0].key=x;int i=currentsize;
while(element[i].key!=x)i--;
for(int i=1;i<=currentsize;i++)
return i;
}
};
template<class T>
ostream& operator <<(ostream& os,const list<T>& l)
{
os<<"the elements are"<<endl;
for(int i=1;i<=l.currentsize;i++)
{
os<<l.element[i].getkey()<<" ";
}
return os;
}

template<class T>
istream& operator >>(istream& is,list<T>& l)
{
cout<<"please input the number"<<endl;
is>>l.currentsize;
cout<<"input the element"<<endl;
for(int i=1;i<=l.currentsize;i++)
{
T x;
is>>x;
l.element[i].setkey(x);
}
return is;
}

int main()
{
list<float> l(10);
cin>>l;
cout<<l;
}
operatingtuzi 2008-12-18
  • 打赏
  • 举报
回复
以下是最新代码
帮忙解惑

#include<iostream>
using namespace std;

template<class T>
class list;

template<class T>
class node
{
private:
T key;
public:
node(){}
node(T k):key(k){}
friend class list< T >;
};

template <class T>
class list
{
private:
node<T> *element;
int maxsize,currentsize;
public:
list(int ms):maxsize(ms),currentsize(0){element=new node<T>[maxsize+1];}
friend ostream& operator <<(ostream& os,const list<T>& l);
friend istream& operator>>(istream& is,const list<T>& l);
int serch(const T& x)
{
element[0].key=x;int i=currentsize;
while(element[i].key!=x)i--;
for(int i=1;i<=currentsize;i++)
return i;
}
};
template<class T>
ostream& operator <<(ostream& os,const list<T>& l)
{
os<<"the elements are"<<endl;
for(int i=1;i<=l.currentsize;i++)
{
os<<l.element[i].key<<" ";
}
return os;
}

template<class T>
istream& operator >>(istream& is,const list<T>& l)
{
cout<<"please input the number"<<endl;
is>>l.currentsize;
cout<<"input the element"<<endl;
for(int i=1;i<=element.currentsize;i++)
{
is>>elementp[i].key;
}
return is;
}

void main()
{
list<float> l(10);
cin>>l;
cout<<l;
}
operatingtuzi 2008-12-18
  • 打赏
  • 举报
回复
哦 那个错误找到了
element类型有误

另外还有两个连接错误:
>1.obj : error LNK2019: 无法解析的外部符号 "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class list<float> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$list@M@@@Z),该符号在函数 _main 中被引用
1>1.obj : error LNK2019: 无法解析的外部符号 "class std::basic_istream<char,struct std::char_traits<char> > & __cdecl operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,class list<float> const &)" (
这个怎么回事

65,211

社区成员

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

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