关于模板函数和模板类的问题

godeyeswang 2009-01-19 08:55:26
我用template写了一个排序的函数,又写了一个类,想用这个函数对类里的成员排序,可是怎么也不成。请教下应该怎么改?谢谢

template<class T>
void bubble(T a[],int l, int r) //bubble sort
{
int i,j;
for(i=l;i<r;i++)
for(j = r; j > i; j--)
if(a[j-1]<a[j])
{
T temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}

template<class T>
class Bag
{
T m_a[10];
int m_size;
public:
......
};

void main()
{
int i;
int data[5];
for (i=0; i<5; i++)
{
cout << "\nEnter data element: ";
cin >> data[i];
}
bubble(data,0,10);// it works
for (i=0; i<5; i++)
{cout << data[i] << " ";}
cout << endl;
Bag<int> temp1;
bubble(temp1, 0, 10); //bubble doesn't work with the Bag class, how to fix it?
}
...全文
152 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
godeyeswang 2009-01-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jiangtianyin 的回复:]
下面的语句应该要修改
bubble(temp1, 0, 10); 改成==》先将成员m_a改成public属性,然后将语句改为buble(temp1.m_a,0,10)
原因:你要排序的应该是类里面的数据成员,而不是对象吧,而且一个对象怎么排序呀,另外如果不用public指定,你的数据成员会被默认为私有类型,外部是不能访问的,只有类里面的公有函数才能访问

解决方案二:将排序函数改成类的内部成员,这样就能通过内部函数访问了!!

你的程序我运行了一下…
[/Quote]
嗯,确实有这个问题,谢谢
jiangtianyin 2009-01-19
  • 打赏
  • 举报
回复
下面的语句应该要修改
bubble(temp1, 0, 10); 改成==》先将成员m_a改成public属性,然后将语句改为buble(temp1.m_a,0,10)
原因:你要排序的应该是类里面的数据成员,而不是对象吧,而且一个对象怎么排序呀,另外如果不用public指定,你的数据成员会被默认为私有类型,外部是不能访问的,只有类里面的公有函数才能访问

解决方案二:将排序函数改成类的内部成员,这样就能通过内部函数访问了!!

你的程序我运行了一下,运行了两次程序就崩溃了,注意数组下标不要越界,!!!!!
godeyeswang 2009-01-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 brookmill 的回复:]
C/C++ codetemplate <class T>
class Bag
{
T m_a[10];
int m_size;
public:
void sort()
{
bubble(m_a, 0, 10);
}
};



然后在main里调用temp1.sort()
[/Quote]

这个对了,谢谢
nullah 2009-01-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 godeyeswang 的回复:]
谢谢楼上两位,我试试把排序写到类的函数里去
[/Quote]
也可以实现一个get函数返回m_a[]
brookmill 2009-01-19
  • 打赏
  • 举报
回复
刚才没注意,数组越界了,
应该是
bubble(data,0,4);
bubble(m_a, 0, 9);
godeyeswang 2009-01-19
  • 打赏
  • 举报
回复
谢谢楼上两位,我试试把排序写到类的函数里去
brookmill 2009-01-19
  • 打赏
  • 举报
回复
template <class T> 
class Bag
{
T m_a[10];
int m_size;
public:
void sort()
{
bubble(m_a, 0, 10);
}
};

然后在main里调用temp1.sort()
godeyeswang 2009-01-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 nineforever 的回复:]
你的Bag类要实现operator <,否则无法比较大小
[/Quote]

具体怎么改呢?目前显示错误是 无法从“重载函数类型”为“T []”推导 <未知> 参数
brookmill 2009-01-19
  • 打赏
  • 举报
回复
bubble的第一个参数是数组,所以从语法上来说应该传temp1.m_a
但这个m_a是private,所以只能如2楼所说,加个成员函数返回m_a的地址,或者把m_a改成public
更好的办法是在类里面写个成员函数来对m_a排序
lightnut 2009-01-19
  • 打赏
  • 举报
回复
Bag <int> temp1;
bubble(temp1, 0, 10); //bubble doesn't work with the Bag class, how to fix it?
======
你这是对Bag<int>的一个变量temp1排序, 而不是对templ中的m_a[10]排序.
按照你的目的, 应该是
bubble(temp1.m_a, 0, 10); 当然前提是m_a是public的, 否则, 你
可以在Bag中的一个成员函数中使用bubble, 用或者使用其他方法能够得到
m_a, 再将之传递给bubble.
godeyeswang 2009-01-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hai040 的回复:]
bubble(temp1, 0, 10);
这里应该是传temp1.get_a/temp1.m_a
[/Quote]

显示错误,无法访问 private 成员?
hai040 2009-01-19
  • 打赏
  • 举报
回复
bubble(temp1, 0, 10);
这里应该是传temp1.get_a/temp1.m_a
nineforever 2009-01-19
  • 打赏
  • 举报
回复
你的Bag类要实现operator<,否则无法比较大小

65,210

社区成员

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

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