c++typename

Posted iuk11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++typename相关的知识,希望对你有一定的参考价值。

声明typename参数时,前缀关键字class和typename可以互换。
使用关键字typename标识嵌套从属类型名称,但不需要在基类列表和成员初始化列表内使用。
从属名称:模板内出现的名称,相依于某个模板参数。T t;
嵌套从属名称:从属名称class内呈嵌套状。T::const_iterator ci;
非从属名称:不依赖任何template参数的名称。int a;
如果不特定指出typename,嵌套从属名称,有可能产生解析歧义。
任何时候在模板中涉及一个嵌套从属类型名称,需要在前一个位置,添加关键字typename;

#include <iostream>  
#include <string>  
#include <vector>  
using namespace std;
template<typename T>
void print2nd(const T& container)
	typename T::const_iterator iter(container.begin());//不加typename报错
	++iter;
	int value = *iter;
	cout<<value;

int main()
	vector<int> vi=1,2,3,4,5;
	print2nd(vi);
	return 0;

例外:嵌套从属类型名称,如果是基类列表和成员初值列中,不使用typename,因为编译器知道这里需要的是类型还是变量。
(1)基类列表里肯定是类型名(2)初始化列表里肯定是成员变量名

#include <iostream>  
#include <vector>       
using namespace std;
struct Number
	Number(int x)
		cout<<"Num="<<x<<endl;
	
;
template<typename T>
struct Base
	typedef Number Nested;
; 
template<typename T>
class Derived:public Base<T>::Nested//不用typename
	public :
		explicit Derived(int x):Base<T>::Nested(x)//不用typename
			typename Base<T>::Nested temp(7);//必须使用
		
;
int main()
	Derived<int> d(5);
	return 0;

以上是关于c++typename的主要内容,如果未能解决你的问题,请参考以下文章

模棱两可的模板实例化

c++typename

c++typename

c语言字符串赋初值

c语言如何通过函数来改变已经赋初值的全局变量的值?

.为啥c语言里有的变量要赋初值,有的变量不用赋。