关于迭代器做为类成员的问题

chichujn 2011-12-25 11:38:32
#include <iostream>
#include <vector>

using namespace std;

class pt
{
public:
vector<int>::iterator id;
public:
pt(vector<int>::iterator it):id(it){}
};

int main()
{
vector<int> v;
vector<int>::iterator it = v.begin();
pt(it);//这里提示错误,类型冲突,换成v.begin()却没问题
system("pause");
return 0;
}
//编译器devc
很奇怪,提示无匹配的构造函数,调用构造复制函数,类型冲突。
...全文
124 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
篾匠 2011-12-26
  • 打赏
  • 举报
回复
看到楼主汗,那我也汗一个吧
如果是要定义一个gt类型的对象,那就真心是低级错误

不过楼主的那种写法其实是可以的,再来几个吧:
int(2);
string("Hi");
其实这些都行
篾匠 2011-12-26
  • 打赏
  • 举报
回复
很诡异的样子呃
我用Code::blocks 10.05的结果:
试了以下种情况:
1) pt( v.begin() ); //OK,这可以理解
2) pt aaaaa=pt( v.begin() ); //OK,可以理解

3) pt(it); //编译出错:
error: conflicting declaration 'pt itr'
error: 'it' has a previous declaration as '__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > > it
4) vector<int>::iterator itr = v.begin();
pt(itr); //编译出错,错误同上
error: conflicting declaration 'pt itr'
error: 'itr' has a previous declaration as '__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > > itr'
5) vector<int>::const_iterator it = v.begin();
pt(it); //编译出错,错误同上,错误信息略之

是不是编译器在背后做了什么手脚了?
个人觉得楼主的写法是没有问题的。
这个跟“匿名对象”有关吧,不懂,求指教!


另外,如果给pt类加一个成员函数,比如就叫fuck()吧
void pt::fuck() { }; //啥事都不用干
然后把出问题的那一行改为:
pt(it).fuck();
然后程序是能够通过编译的哦!

因此,我最终的猜测是,楼主的写法是没有问题的;但是编译器觉得这么没头没脑地来这么一行,简直是很伤很天真,于是编译器这家伙就自作聪明地在背后搞了某些优化,于是杯具了。
最终猜测:编译器搞优化的时候出了bug...
chichujn 2011-12-26
  • 打赏
  • 举报
回复
汗。。。这种低级错误。。。
iamnobody 2011-12-25
  • 打赏
  • 举报
回复
pt(it);//这里是声明一个pt对象名字叫it的意思

改成这样:
pt p(it);

64,282

社区成员

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

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