作用一:
#include <iostream>
#include <vector>
#include <algorithm> //所有泛型算法
#include <functional>//所有函数对象
#include <ctime>
template <typename container>
void print_container(container& con){
//typename container::iterator it = con.begin();
container::iterator it = con.begin();//故意没有加typename
for (; it != con.end(); ++it){
std::cout << *it << " ";
}
std::cout << std::endl;
}
//#if 1
int main(){
std::vector<int> vec;
srand(time(nullptr));//以系统时间为随机数种子
for (int i = 0; i < 20; ++i){
vec.push_back(rand() % 100 + 1);
}
print_container(vec);
return 0;
}
使用g++编译器编译后:
main.cpp: In function ‘void print_container(container&)’:
main.cpp:9: error: expected ‘;’ before ‘it’
main.cpp:15: error: ‘it’ was not declared in this scope
main.cpp: In function ‘void print_container(container&) [with container = std::vector<int, std::allocator<int> >]’:
main.cpp:28: instantiated from here
main.cpp:9: error: dependent-name ‘container::iterator’ is parsed as a non-type, but instantiation yields a type
main.cpp:9: note: say ‘typename container::iterator’ if a type is meant
解释:
编译器从上到下扫描,此时container还没有被实例化过,编译器还不知道container::后面是一个类型,而不是变量;
一些旧的编译器,只有函数被实例化才会去编译实例化这个函数模板,所以可能没什么问题
对于g++编译器也需要添加typename 告诉编译container::后面是一种类型
作用二:
template <typename container>
template <class container>
作用是一样的