Reputation: 1719
I have a problem about how to use iterator under the template manner.
Here is an example I am trying to do, the problem is that, inside the for loop how can I initial the iterator pp ?
I have read a similar question, but I cannot fully understand that since I am a beginner.
What should the iterator type be in this C++ template?
Can anyone help and also provide some simple explanation?
#include <iostream>
#include <vector>
template <class T>
void my_print(std::vector<T> input){
for(std::vector<T>::iterator pp = input.begin(); pp != input.end(); ++pp)
std::cout << *pp << "\n";
}
int main(int argc,char* argv[]){
std::vector<int> aa(10,9);
my_print(aa);
return 0;
}
error message I got:
‘std::vector::iterator’ is parsed as a non-type, but instantiation yields a type
Upvotes: 15
Views: 18783
Reputation: 4402
Add a typename
before the iterator
#include <iostream>
#include <vector>
template <class T>
void my_print(std::vector<T> input)
{
for (typename std::vector<T>::iterator pp = input.begin(); pp != input.end(); ++pp)
{
std::cout << *pp << "\n";
}
}
int main(int argc, char* argv[])
{
std::vector<int> aa(10, 9);
my_print(aa);
return 0;
}
Upvotes: 26
Reputation:
Like Dieter says, newer versions of gcc will pretty much tell you where typename is needed:
error: need 'typename' before 'std::vector<T>::iterator'
because 'std::vector<T>' is a dependent scope
Simple fix:
for(typename std::vector<T>::iterator pp = input.begin();
pp != input.end(); ++pp)
Here is an explanation Error with T::iterator, where template parameter T might be vector<int> or list<int>
Before a qualified dependent type, you need typename. Without typename, there is a C++ parsing rule that says that qualified dependent names should be parsed as non-types even if it leads to a syntax error.
For a more comprehensive explanation, check out Why is the keyword "typename" needed before qualified dependent names, and not before qualified independent names?
Upvotes: 4