LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 999|回复: 6

iterator到void*的转换,g++编译不过。

[复制链接]
发表于 2005-4-22 14:30:12 | 显示全部楼层 |阅读模式
别人提供了一个类库,里面有如下的操作
vector<const CQuest*> tbl;
...
qsort(tbl.begin(). …………


编译不过,说iterator 不能转换为 void*,
难道在GCC中过不了么?这个程序是在HP上编的,难道HP上的可以过?
发表于 2005-4-22 18:06:32 | 显示全部楼层
iterator本来就不是指针,只不过是重载了operator->,不能转成void*
qsort模板函数应该能接受iterator参数。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-22 23:12:56 | 显示全部楼层
Post by efan
iterator本来就不是指针,只不过是重载了operator->,不能转成void*
qsort模板函数应该能接受iterator参数。

如果qsort能够接受iterator参数的话,那么为何这边编译不过呢?什么原因?
回复 支持 反对

使用道具 举报

发表于 2005-4-23 02:12:03 | 显示全部楼层
改用sort而不是qsort
回复 支持 反对

使用道具 举报

发表于 2005-4-23 11:37:55 | 显示全部楼层
qsort()函数是C库函数,为了保证通用只能使用 void*; C++ 自己有自己的 std::sort() 泛型算法支持快速排序,它使用的是 iterator。

vector::iterator 在实现上可能表现为一个指针(至少据我所知 GCC 2.95.* 是如此),但是在概念上我们应当将其抽象为一个“迭代器”(注意不要与相对底层的“指针”概念混淆起来)。从概念上说任何迭代器都没有义务允许用户将自己转型成 void* ,建议楼主在使用 C++ STL 时最好彻底忘记那些 C 标准库的函数,它们并不兼容。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-24 14:44:10 | 显示全部楼层
Post by cppof286
qsort()函数是C库函数,为了保证通用只能使用 void*; C++ 自己有自己的 std::sort() 泛型算法支持快速排序,它使用的是 iterator。

vector::iterator 在实现上可能表现为一个指针(至少据我所知 GCC 2.95.* 是如此),但是在概念上我们应当将其抽象为一个“迭代器”(注意不要与相对底层的“指针”概念混淆起来)。从概念上说任何迭代器都没有义务允许用户将自己转型成 void* ,建议楼主在使用 C++ STL 时最好彻底忘记那些 C 标准库的函数,它们并不兼容。

非常赞成您的建议,但是,现在这些库代码全部是客户提供的,估计代码本身已经非常老了,也是在老版本的GCC中可以编译通过的,现在开发新的程序的时候就遇到了问题。
回复 支持 反对

使用道具 举报

发表于 2005-4-25 13:04:11 | 显示全部楼层
应该可以这样子:

qsort(&tbl[0], ...)

C++标准保证std::vector使用连续的内存区域.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表