Próbuję napisać funkcję drukowania reprezentacji wspólnych kontenerów STL (wektor, lista itp.). Nadałem tej funkcji parametr szablonu T, który może na przykład reprezentować wektor. Mam problemy z dostaniem iterator typu T.Błąd z T :: iteratorem, gdzie parametr szablonu T może być wektorem <int> lub listą <int>
vector<int> v(10, 0);
repr< vector<int> >(v);
...
template <typename T>
void repr(const T & v)
{
cout << "[";
if (!v.empty())
{
cout << ' ';
T::iterator i;
for (i = v.begin();
i != v.end()-1;
++i)
{
cout << *i << ", ";
}
cout << *(++i) << ' ';
}
cout << "]\n";
}
...
[email protected]:~/Desktop/stl$ g++ -Wall main.cpp
main.cpp: In function ‘void repr(const T&)’:
main.cpp:13: error: expected ‘;’ before ‘i’
main.cpp:14: error: ‘i’ was not declared in this scope
main.cpp: In function ‘void repr(const T&) [with T = std::vector<int, std::allocator<int> >]’:
main.cpp:33: instantiated from here
main.cpp:13: error: dependent-name ‘T::iterator’ is parsed as a non-type, but instantiation yields a type
main.cpp:13: note: say ‘typename T::iterator’ if a type is meant
Próbowałem 'typename T :: iterator' jako sugerował kompilator, ale dostał tylko bardziej tajemniczy błąd.
Edytuj: Dzięki za pomoc! Oto wersja pracy dla każdego, kto chce korzystać z tej funkcji:
template <typename T>
void repr(const T & v)
{
cout << "[";
if (!v.empty())
{
cout << ' ';
typename T::const_iterator i;
for (i = v.begin();
i != v.end();
++i)
{
if (i != v.begin())
{
cout << ", ";
}
cout << *i;
}
cout << ' ';
}
cout << "]\n";
}
Co powiesz na opublikowanie również "bardziej tajemniczego" komunikatu o błędzie? –
btw, możesz chcieć zamienić v.end() - 1 na coś innego niż wsparcie dla non-RandomAccess-iteratorów. – sellibitze