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关键字用法