Funkcja zwracająca wektor iteratorów

0
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.

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.

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ą.

/* 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.

0

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

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