作用一:
#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>
作用是一樣的