次のコードは、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
$
問題は、 'check_iterator'と' iterator'を 'check()'で比較していると思います。 – drescherjm
はい、そうです。ペーストビンにログインする:http:// pastebin。com/FDziGfMm –
いいえ、 'const_iterator'を' iterator'に変更しても動作しません。 –