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>
作用是一样的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值