c++typename

作用一:

#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>
作用是一樣的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章