关于模板的问题

wangdongzjk 2010-11-02 08:23:09
本人没搞过c++,最近单位有一个c++的项目。
实现了如下的类型:
typedef std::set< P< ::InventoryTracking::A> > ASet;
typedef std::set< P< ::InventoryTracking::B> > BSet;
...
P是智能指针,暂且可以认为是::InventoryTracking::A*的替代品。

现在需要迭代Set中的数据,如果一般的写法,必须针对每种不同的类型,写出不同的for循环,但其实代码是一样的,就是类型不一样,不知道用模板怎么实现,我自己乱写了一个,但是编译不能通过
template <class T>

T getFirstIterator(std::set<P<T> > s)
{
for(s::iterator i = s.begin(); i != s.end(); i++)
{
return (T)(*i);
}
}


请各位高手指点
...全文
209 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
太乙 2010-11-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 qq120848369 的回复:]

引用 10 楼 hqin6 的回复:
引用 5 楼 qq120848369 的回复:

引用 4 楼 hqin6 的回复:
C/C++ code
#include <iostream>
#include <set>
using namespace std;

template <typename T>
class P
{
public:
operator T() con……
[/Quote]可能我说的不明白,我这里指的智能指针是auto_ptr,不是shared_ptr
libinfei8848 2010-11-03
  • 打赏
  • 举报
回复
template <class T>

T getFirstIterator(std::set<P<T> > s)
{
for(s::iterator i = s.begin(); i != s.end(); i++)
{
return (T)(*i);
}
}
LZ这样写,完全看不到要迭代的意思啊?
每次都返回第一个元素?
qq120848369 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 chenhui880412 的回复:]
for(s::iterator i = s.begin(); i != s.end(); i++)

s::iterator 应改为std::set<P<T> >::iterator


return (T)(*i);楼主是想返回什么?
[/Quote]

楼上正解
i_Seven_ 2010-11-02
  • 打赏
  • 举报
回复
for(s::iterator i = s.begin(); i != s.end(); i++)

s::iterator 应改为std::set<P<T> >::iterator


return (T)(*i);楼主是想返回什么?
qq120848369 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hqin6 的回复:]
引用 5 楼 qq120848369 的回复:

引用 4 楼 hqin6 的回复:
C/C++ code
#include <iostream>
#include <set>
using namespace std;

template <typename T>
class P
{
public:
operator T() const
{
return mi;
}
……
[/Quote]

智能指针真能放容器里,和handle实现方式一样,在智能指针类里存一个int *count;
拷贝构造的时候给*count+1,然后拷贝count给另外一个对象就可以了,同一个
智能指针的对象的所有拷贝都有同一个*count值.

auto_ptr貌似没有这个机制.
太乙 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qq120848369 的回复:]

引用 4 楼 hqin6 的回复:
C/C++ code
#include <iostream>
#include <set>
using namespace std;

template <typename T>
class P
{
public:
operator T() const
{
return mi;
}
……


他那个P是智能指针,不是自己写的P……
[/Quote]智能指针能用在set里么??不管是不是智能指针,模式几乎都一致吧?不要太死板叻
gules 2010-11-02
  • 打赏
  • 举报
回复

template <class T>
typename std::set<P<T> >::iterator
getFirstIterator(std::set<P<T> > & s) // 返回第一个迭代码器,引用是防止拷贝
{
typename std::set<P<T> >::iterator i = s.begin();
return i;
//return s.begin(); // 或者直接用此句

//for(; i != s.end(); ++i) // 就返回一个,还要循环?
//{
// return *i;
//}
}
qq120848369 2010-11-02
  • 打赏
  • 举报
回复
s明明在,怎么会说不在,这个我就很费解了.
wangdongzjk 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qq120848369 的回复:]

C/C++ code

T& getFirstIterator(std::set<P<T> > s) //这个还是返回T&比较合理,毕竟你要改动指针实际指向的值或者使用它.
{
for(s::iterator i = s.begin(); i != s.end(); i++)
{
P<T> p=(*i); //智能指针对象
return *p; //实际对象
}
}
[/Quote]

这样写不行,我最先就是这么写的,编译器说s不存在。
wangdongzjk 2010-11-02
  • 打赏
  • 举报
回复
是的,确实不是自己的class P,而是智能指针
qq120848369 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hqin6 的回复:]
C/C++ code
#include <iostream>
#include <set>
using namespace std;

template <typename T>
class P
{
public:
operator T() const
{
return mi;
}
……
[/Quote]

他那个P是智能指针,不是自己写的P.
太乙 2010-11-02
  • 打赏
  • 举报
回复
#include <iostream>
#include <set>
using namespace std;

template <typename T>
class P
{
public:
operator T() const
{
return mi;
}
void set(T t)
{
mi = t;
}
private:
T mi;
};

template <typename T>
void fun(set<P<T> > & s)
{
for (typename set<P<T> >::iterator it = s.begin(); it != s.end(); ++it)
cout << *it << "\t";
cout << endl;
}

int main()
{
set<P<int> > s;
P<int> p;
p.set(10);
s.insert(p);
fun(s);
return 0;
}
qq120848369 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 se7venhigh 的回复:]
函数的参数传入使用传址调用,T getFirstIterator(const std::set<P<T> > &s)
原先使用的传值调用方式中,存在一次拷贝,你返回的其实是这个局部副本的具体数据,但是这个副本在函数体结束之后就被析构了。
PS:你的函数貌似没有达到你的目的吧,因为执行一次以后就return出来了。。。。
[/Quote]

LS的回答问题很多,LZ别被误导.
se7venhigh 2010-11-02
  • 打赏
  • 举报
回复
函数的参数传入使用传址调用,T getFirstIterator(const std::set<P<T> > &s)
原先使用的传值调用方式中,存在一次拷贝,你返回的其实是这个局部副本的具体数据,但是这个副本在函数体结束之后就被析构了。
PS:你的函数貌似没有达到你的目的吧,因为执行一次以后就return出来了。。。。
qq120848369 2010-11-02
  • 打赏
  • 举报
回复

T& getFirstIterator(std::set<P<T> > s) //这个还是返回T&比较合理,毕竟你要改动指针实际指向的值或者使用它.
{
for(s::iterator i = s.begin(); i != s.end(); i++)
{
P<T> p=(*i); //智能指针对象
return *p; //实际对象
}
}

64,646

社区成员

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

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