Funkcja zwracająca wektor iteratorów

Funkcja zwracająca wektor iteratorów
didzni
  • Rejestracja:prawie 9 lat
  • Ostatnio:dzień
  • Postów:136
0
Kopiuj
template <typename A, typename B>
vector<typename A::iterator> policz(A& s, B znak)
{
	vector<typename A::iterator> wek;
	for (auto p = s.begin(); p < s.end(); p++)
		if (*p == znak) wek.push_back(p);
	return wek;
};

Dlaczego parametrem wektora musi być typename A::iterator a nie po prostu A::iterator ? Kompilator zgłasza, że A::iterator to nie jest poprawna nazwa typu.

edytowany 2x, ostatnio: didzni
plx211
Uważaj z vektorem iteratorów, bo możesz później mieć problem z próbą odczytu do nie istniejącego odcinka pamięci (np. na wskutek realokacji pamięci kontenera do którego wskazuje iterator). Pisze to na podstawie swojej zabawy :) więc miło by było jak ktoś by to zweryfikował ;)
several
  • Rejestracja:prawie 16 lat
  • Ostatnio:około 6 godzin
3

Dzieje się tak, ponieważ A::iterator to tak zwany dependent name. Kompilator nie może sprawdzić czy iterator jest typem, czy np statycznym polem i domyślnie zakłada to drugie. Poprzez użycie typename dajesz kompilatorowi do zrozumienia, że ma do czynienia z typem.


Spearhead
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 8 godzin
  • Postów:1002
0

Bodajże dlatego, że parametrem wektora musi być typ a T::iterator może nie być definicją typu, a na przykład zmienną statyczną.

Kopiuj
/* T1::iterator jest typem */
struct T1 {
    using iterator = int*;
};

/* T2::iteartor jest zmienną */
struct T2 {
    static int iterator;
};

Więc trzeba jawnie wskazać, że chodzi nam o typ.

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:41 minut
  • Postów:4938
0

Before a qualified dependent type, you need typename: http://pages.cs.wisc.edu/~driscoll/typename.html


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.