C++中typedef和typename关键字的使用

Posted PanGC2014

tags:

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

一、在C中使用typedef关键字:是为了给内建类型或用户自定义数据类型定义符号名称,typedef是由编译器执行解释的,比如:

typedef unsigned char Name;
 
typedef struct Books 
    char  title[50];
    char  author[50];
    char  subject[100];
    int   book_id;
 Book;

这样之后标识符Name可以作为类型unsigned char的缩写,Book可以作为结构体struct Books的缩写,可以定义新变量Name c或Book mybook等等。

二、在C++中使用typedef关键字:同样是由编译器执行解释的;并且在class类中使用时具有public和private权限,通过限制该类型别名的作用域来防止冲突;在public作用域下,可以在类外使用该类型别名,但必须使用::作用域符号。在函数内部使用typedef时,这个别名在函数体外是不可使用的。

class demo_a 
public:
	typedef int VALUE;
	VALUE getValue() const;
private:
	VALUE value;
;

demo_a::VALUE demo_a::getValue() const

	std::cout << "demo_a::getValue()" << std::endl;
	return value;


int main()

	demo_a obj_a;
	obj_a.getValue();
	system("pause");
	return 0;

三、在C++类模板中使用typedef,编译器要求typedef定义类型转变的时候必须是确定的类型,所以使用时要注意。

template<typename T>
class demo_b 
public:
	typedef T VALUE;
	VALUE getValue() const;
private:
	VALUE value;
;

template<typename T>
demo_b<T>::VALUE demo_b<T>::getValue() const

	std::cout << "demo_b::getValue()" << std::endl;
	return value;


int main()

	demo_b<int> obj_b;
	obj_b.getValue();
	system("pause");
	return 0;

这样编译时会报“依赖名称不是类型”的错误,具体如下:

错误原因是:类模板和函数模板只有在实例化时编译器才能知道T的具体类型,在此之前类模板参数T可以是任意一种类型,编译器在遇到<T>和"::"同时出现或者T和"::"同时出现,即类模板和函数模板两种情况时,无法准确识别其后的内容,认为其可能是一个类型或是一个静态成员,一直到实例化这个类模板或函数模板时才能知道,并且默认情况下编译器认为其是静态成员,所以报出“依赖名称不是类型”的错误。

解决办法是:在函数demo_b<T>::VALUE demo_b<T>::getValue() const 前面添加关键字typename加以声明,显式地告诉编译器demo_b<T>::VALUE是一个类型。

template<typename T>
typename demo_b<T>::VALUE demo_b<T>::getValue() const

	std::cout << "demo_b::getValue()" << std::endl;
	return value;

同样在函数模板中也需要用typename关键字声明类型,具体代码示例如下:

template<typename T>
typename T::size_type getlength(const T&c)

	if (c.empty())
		return 0;
	return c.size();

 

以上是关于C++中typedef和typename关键字的使用的主要内容,如果未能解决你的问题,请参考以下文章

c++中typenametypedef以及using关键字用法

c++中typenametypedef以及using关键字用法

c++中typenametypedef以及using关键字用法

C++中typename和class的区别

C++中typedef是啥意思啊

C++模板typename关键字的用法