美文网首页
c++ typename

c++ typename

作者: NullUser | 来源:发表于2021-02-27 15:51 被阅读0次

在查看c++ stl头文件源码stl_list.h时发现typename的用法。

//stl_list.h中list模板类的源码 
template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
class list: protected _List_base<_Tp, _Alloc>
{
//conccept requirements
typedef typename _Alloc::value_type  _Alloc_value_type;
......
}

_Alloc是一个模板参数,而_Alloc::value_type中value_type是依赖于_Alloc的类型的。对于value_type等依赖于模板参数的名字叫做“依赖名字”,如果value_type又是嵌套在类中,那么它叫“嵌套依赖名字”。

此时,在_Alloc被明确前,value_type实际是什么都是未知的,它有可能是一个类型,也可能是个静态成员变量。虽然我们在使用的时候知道它是一个类型,但编译器并不知道,所以如果_Alloc::value_type前面不加 typename将会报错。当我们加上typename后,即相当于告诉了编译器,value_type是作为一种类型去使用的。

我们写段demo验证以下

template <typename T>
class Test
{
  typedef T::DataType D;
};

int main()
{
  return 0;
}

定义一个模板类Test,用typedef重命名T::DataType为 D
用g++编译:g++ -c main.cpp -o main.o
此时编程器报错,提示T::data前需要typename,因为‘T’是一个有依赖的作用域。
当我们加上typename,可正常编译通过

template<typename T>
class Test
{
  typedef typename T::DataType D;
};

下方连接对此做了详细介绍:
https://blog.csdn.net/dick_china/article/details/4522253

相关文章

  • C++ 模板

    C++ 模板 typename 和 class 关键字 在c++模板中非常多地方都用到了typename与clas...

  • c++ typename

    在查看c++ stl头文件源码stl_list.h时发现typename的用法。 _Alloc是一个模板参数,而_...

  • 05 棘手的问题

    typename前缀 C++默认用::访问的名称不是类,因此必须加上typename前缀,告诉编译器该名字是一个类...

  • c++ template

    1、typename 与 class在模板引入 c++ 后,最初定义模板的方法为:template

  • c++语法系列之7-- 函数模板

    (C++ Templates笔记) 1 函数模版的定义 说明:1)typename后面的T为模板参数,max后面的...

  • 条款 42:了解 typename 的双重意义

    《Effective C++ 中文版 第三版》读书笔记 条款 42:了解 typename 的双重意义 templ...

  • [C++] typename的双重意义

    提一个问题:以下template声明式中,class和typename有什么不同? 答案:没有不同。当我们声明te...

  • 【备忘】c++范型的种种

    速写c++范性 template声明下一个域存在范型 Q:范型/模版,意味着什...

  • 条款42: 了解typename的双重意义

    如下: 虽然使用了不同的关键字,但从C++的角度来说,声明模板参数时,关键字class 和typename意义完全...

  • C++中的template 用法详解

    template 是C++中用于定义模板的固定格式。模板是实现代码重用机制的一种工具,它...

网友评论

      本文标题:c++ typename

      本文链接:https://www.haomeiwen.com/subject/eyfifltx.html