【发布时间】:2010-05-10 23:21:59
【问题描述】:
以下代码引发运行时错误:
#include <iostream>
#include <iterator>
#include <ext/slist>
class IntList : public __gnu_cxx::slist<int> {
public:
IntList() { tail_ = begin(); } // seems that there is a problem here
void append(const int node) { tail_ = insert_after(tail_, node); }
private:
iterator tail_;
};
int main() {
IntList list;
list.append(1);
list.append(2);
list.append(3);
for (IntList::iterator i = list.begin(); i != list.end(); ++i) {
std::cout << *i << " ";
}
return 0;
}
看来问题出在构造函数IntList()。是不是因为调用了成员函数begin()?
【问题讨论】:
-
你为什么要自己定义
iterator?而且,如果这个slist是基于 STLslist的,那么它没有虚拟析构函数,所以你可能不应该公开(或根本不)从它派生。 -
对不起。 typedef 是一个错误。我已经修改过了。
-
对我来说问题是 append()。您是否使用 -g 标志编译过。此外,添加打印语句以查看崩溃的位置可能会有所帮助
-
@James 和 poerboy。技术上是的。但与问题无关。
-
@Martin:在这种情况下很不寻常,因为
slist<T>::iterator是一个公共类型定义,所以完全没有必要。如果公共基类具有公共 typedef,则没有理由在派生类中重新声明它。至于我的评论与问题无关,这就是为什么我将其发布为评论而不是答案。使用 cmets 提出问题或建议(例如,不要从没有虚拟析构函数的类派生)是常见的做法。
标签: c++