我正在创建迭代器:
typename Report::container_type_for_processed_files::const_iterator beg = rep.processed_files().begin();
typename Report::container_type_for_processed_files::const_iterator end = rep.processed_files().end();
我的报告类看起来:
class Report
{
public:
typedef std::map<boost::filesystem3::path,
std::pair<unsigned long long/*code*/,
unsigned long long/*comment*/> > container_type_for_processed_files;
container_type_for_processed_files processed_files()const;
private:
container_type_for_processed_files processed_files_;
};
cpp中的已处理文件如下所示:
typename Report::container_type_for_processed_files Report::processed_files()const
{
return processed_files_;
}
但在初始化迭代器之后,如第一行所示:
typename Report::container_type_for_processed_files::const_iterator beg = rep.processed_files().begin();
typename Report::container_type_for_processed_files::const_iterator end = rep.processed_files().end();
while (beg != end)
{
qDebug() << beg->first.c_str();//here I'm getting runtime error
fout << "File name: " << (beg->first).c_str();
++beg;
}
我收到错误:传递给C运行时函数的参数无效
在尝试初始化迭代器时,我也在输出窗格上收到消息:
(内部错误:在psymtab中读取pc 0x201,但在symtab中没有。)
这是怎么回事?
答案 0 :(得分:3)
如果没有可编辑的样本,我不确定这是你的问题,但这看起来很可疑:
container_type_for_processed_files processed_files() const;
你最有可能在那里向容器返回一个const&
,否则该函数将返回底层容器的副本(可能是临时的),并且你的迭代器最终会失效(不是同一个对象的迭代器) ,也可能是终身已经结束的临时工的迭代器。)
尝试:
container_type_for_processed_files const& processed_files() const;
答案 1 :(得分:0)
一个问题是rep.processed_files()
会返回基础容器的副本。因此,beg
和end
适用于两个单独的对象;尝试从一个地图的开头迭代到另一个地图的末尾没有意义 - 它将迭代超过第一个容器的末尾。您应该返回对包含对象的引用。
typename Report::container_type_for_processed_files & Report::processed_files()const
{
return processed_files_; // Returns by reference
}
当你定义beg和end
时,你需要&
typename Report::container_type_for_processed_files::const_iterator & beg = rep.processed_files().begin();
typename Report::container_type_for_processed_files::const_iterator & end = rep.processed_files().end();
其他问题可能还有其他问题。例如,qDebug
是什么?