String iterators are incompatible

0

Z wykorzystaniem wyrażeń regularnych z boosta, próbuję wyszukać w danym stringu ciągi znaków, które mogą być rokiem (np. "2014 r."). Nie potrafię dojść do przyczyny błędu - na wskazanej linijce (lub następnej, jeśli usunę tą pierwszą) otrzymuję wyjątek: "String iterators are incompatible". Niby sprawdzam, czy vector nie jest pusty, z resztą samo użycie iteratora ze wskazaniem na v_date.begin() powinno chyba wskazać istniejący obiekt...? Treść błędu tak czy siak wskazuje, że błąd nie dotyczy braku obiektu, a niedopasowania typu raczej... Ale dlaczego?

		vector<regExpResult> v, v_date;

		findRegExp(text.substr(0, promulgatorPosition), L"(\\d{2,4}\\sr\\.)", v_date, false);
		if (v_date.size() == (size_t) 0)
			continue;

		std::wstring foundDate;
		int lastDatePosition = -1;
		for (std::vector<regExpResult>::iterator dateItr = v_date.begin(); dateItr != v_date.end(); ++dateItr)
		{
			foundDate = (*dateItr).str().substr(0,4);     // ta linijka daje błąd
			size_t datePosition = (*dateItr).position((unsigned int)0);		//ta też
		}

regExpResult jest zdefiniowane jako:

typedef boost::match_results<std::wstring::const_iterator> regExpResult;
2

text.substr(0, promulgatorPosition) to jest wartość w zasadzie tymczasowa tzn. po wyjściu z funkcji findRegExp to, co zwróciło substr przestaje istnieć. Iteratory przechowywane przez boost::match_results nie mają już sensu i leci wyjątek.

Btw: <regex> jest w standardzie już.

PS: promulgator? Brzmi jak bulbulator. ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1