typename关键字详解(消除歧义)

typename关键字详解

定义

typename相当于泛型编程中class的同义关键字,用来指出模板类型所依赖的名称是类型名而非变量名

变量名:int bar 中 bar是变量名,int是类型名

typedef int bar :bar 也是类型名,是类型int的别名

用法

1.和class同义,用于引入泛型编程中所用到的模板参数

// 定义一个返回参数中较大者的通用函数
template <typename T>
const T& max(const T& x, const T& y)
{
  return x > y ? x : y;
}

等价于

template <class T>
const T& max(const T& x, const T& y)
{
  return x > y ? x : y;
}

2.用来消除歧义,告诉编译器后面的是类型名而不是变量名

我们先定义两个结构体:

struct StructWithBarAsType
{
    typedef int bar;//bar 位类型名
};  
struct StructWithBarAsValue
{
    int bar;// bar为变量名
};

然后来看下面这段代码:

template <class T>
void foo(const T& t)
{
    // 声明一个指向某个类型为T::bar的对象的指针
    T::bar * p;		//能得到我们想要的结果吗???
}

int main()
{
    StructWithBarAsType x;
    foo(x);
    
    StructWithBarAsValue y;
    foo(y);
}

这段代码是有问题的,因为编译器并不清楚bar是什么:

  • bar可能是像第一个结构体中,是一个类型名,此时p是指向bar类型的指针
  • bar也可能是第二个结构体中,作为一个变量名,此时foo( )不会将 * 作为指针的标志,而是将其看为乘号,实现bar*p

此时就出现了歧义,在C++中,编译器默认bar为变量名,如果作为类型名,需要在前面加上typename

template <typename T>
void foo(const T& t)
{   
    // 声明一个指向某个类型为T::bar的对象的指针
    typename T::bar * p;
}

这样就确定了p为一个指向bar类型的指针,不会出现歧义

  • 23
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
C++ 中,`typename` 关键字的主要作用是告诉编译器其后面的符号是一个类型名称(type name),而不是一个值(value),以避免编译器的歧义。具体来说,`typename` 关键字可以用于以下两种情况: 1. 在模板中使用嵌套类型时,需要使用 `typename` 关键字来告诉编译器其后面的符号是一个类型名称,而不是一个静态成员变量或函数。 例如,假设有以下的模板类: ``` template <typename T> class MyClass { public: typedef T value_type; ... }; ``` 如果在模板类的成员函数中使用 `value_type`,需要使用 `typename` 关键字告诉编译器其后面的符号是一个类型名称: ``` template <typename T> void MyClass<T>::foo() { typename MyClass<T>::value_type x; // 使用typename关键字 ... } ``` 2. 在使用模板时,需要使用 `typename` 关键字来告诉编译器其后面的符号是一个类型名称,而不是一个静态成员变量或函数。 例如,假设有以下的模板函数: ``` template <typename T> void foo(typename T::value_type x) { ... } ``` 如果在使用该模板函数时,传递的类型 `T` 中有一个名为 `value_type` 的嵌套类型,需要使用 `typename` 关键字告诉编译器其后面的符号是一个类型名称: ``` struct MyStruct { typedef int value_type; }; int main() { MyStruct s; foo<MyStruct>(s); // 使用typename关键字 ... } ``` 总之,`typename` 关键字的作用是告诉编译器其后面的符号是一个类型名称,以避免编译器的歧义

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值