私は、スペース区切りの単語列を表すクラスを、それらの単語のベクトルとベクトルの反復子を介して表します。Visual StudioでのC++の `vector iterators incompatible`エラーのみ
class WordCrawler{
public:
WordCrawler(std::string, bool reversed=false);
WordCrawler& operator--();
std::string operator* () const;
bool atBeginning() const;
private:
std::vector<std::string> words;
std::vector<std::string>::iterator it;
};
私はこの機能を使用して、逆の順序で単語をプリントアウトしようとしています:の
WordCrawler::WordCrawler(std::string in, bool reversed) {
std::istringstream iss(in);
std::string token;
while (std::getline(iss, token, ' '))
{
words.push_back(token);
}
if (reversed) {
it = words.end();
} else {
it = words.begin();
}
}
残り:
void print_in_reverse(std::string in) {
WordCrawler wc = WordCrawler(in, true);
while (!wc.atBeginning()) {
--wc;
std::cout << *wc << " ";
}
}
が、私はこのコンストラクタで私のWordCrawler
オブジェクトを構築メンバ関数はかなり単純です:
/**
True if pointer is at the beginning of vector
*/
bool WordCrawler::atBeginning() const {
return it == words.begin();
}
/**
Function that returns the string stored at the pointer's address
*/
std::string WordCrawler::operator*() const {
return *it;
}
/**
Function that increments the pointer back by one
*/
WordCrawler& WordCrawler::operator--() {
if (!atBeginning())
--it;
return *this;
}
私はすべてXcodeとcpp.shでうまく動作していますが、Visual StudioではatBeginning()
という機能でvector iterators incompatible
というランタイムエラーが発生します。私の前提は、コードが何らかの未定義の振る舞いに依存しているからですが、C++には比較的新しいので、どういうことがわかりません。
私はit
は常にwords
ベクトルのイテレータであることを知っている、と私はit
が初期化された後words
が変化しないことを知っているので、私は問題が何であるかわかりません。
完全なコードで:http://codepad.org/mkN2cGaM
使用しているインポートステートメントは何ですか? – awiebe
@awiebe 'iostream'、' vector'、 'string'、' sstream'です。 – Jackson
フルソースへのリンクを追加しました。 – Jackson