【发布时间】:2017-06-08 13:00:29
【问题描述】:
以下代码在 Microsoft Visual Studio 2015 中不起作用:
#include <vector>
#include <list>
#include <iostream>
class ListWithIterator
{
public:
ListWithIterator() : m_iterator(m_list.end()) {}
bool check() const { return m_iterator == m_list.end(); }
private:
typedef std::list<int> list_t;
list_t m_list;
list_t::const_iterator m_iterator;
};
int main(int, char**)
{
std::vector<ListWithIterator> v;
v.resize(1);
if (v[0].check())
{
std::cerr << "Yes" << std::endl;
}
else
{
std::cerr << "No" << std::endl;
}
return 0;
}
MSVC 说:
check()函数内的“调试断言失败”、“表达式:列表迭代器不兼容”。
g++ 编译它没有任何警告,但它工作错误:
$ g++ sample.cpp -g -Og -Wall
$ ./a.out
No
$
我希望输出“是”,因为迭代器由 m_list.end() 初始化,但 bool check() const { return m_iterator == m_list.end(); } 返回 false。
更新:
正确的解决方案:
$ cat sample.cpp
#include <vector>
#include <list>
#include <iostream>
class ListWithIterator
{
public:
ListWithIterator() : m_iterator(m_list.end()) {}
ListWithIterator(const ListWithIterator& from): m_list(from.m_list), m_iterator(m_list.end())
{
}
bool check() const
{
std::cerr << m_list.size() << std::endl;
return m_iterator == m_list.end();
}
private:
typedef std::list<int> list_t;
list_t m_list;
list_t::iterator m_iterator;
};
int main(int, char**)
{
std::vector<ListWithIterator> v;
v.resize(1);
if (v[0].check())
{
std::cerr << "Yes" << std::endl;
}
else
{
std::cerr << "No" << std::endl;
}
return 0;
}
$ g++ sample.cpp -g -Og -Wall
$ ./a.out
0
Yes
$
【问题讨论】:
-
我认为问题在于您将
const_iterator与check()中的iterator进行比较。 -
是的。将日志放入pastebin:pastebin.com/FDziGfMm
-
不,即使我将
const_iterator更改为iterator也不起作用。 -
使用新的解决方案,如果这很重要,您会在复制过程中丢失迭代器的位置。我的意思是,如果 m_iterator 没有指向 end(),则不会保留在复制构造函数中。
-
是的,我明白了。对我来说没关系。