雪千渔Blog

  • 首页
  • Coding
    • dotNet
    • C++
    • Lua
    • Visual Basic
    • Java
    • Android
    • Web
  • DCC
    • Maya
    • Maya-Plug
    • AfterEffect
    • AfterEffect-Plug
    • PhotoShop-Plug
  • GameDev
    • Unity3D
    • UnrealEngine
    • 经验杂谈
    • 游戏设计
    • 自研引擎
    • 效果实现
  • Graphics
    • OpenGL
    • Vulkan
    • 计算机图形学
  • 其他
    • 乱七八糟
    • 软件工具
    • 留言板
    • 自制素材
    • 关于我
雪千渔blog
唯有热爱,能抵漫长岁月
  1. 首页
  2. Coding
  3. C++
  4. 正文

C++使用类模板中的类模板与类

2021年5月19日 856点热度 0人点赞 0条评论

此文章主要涉及C++中template与typename关键字的使用,正常情况下template用来定义模板,typename后面定义类型名字,除此之外还有些其他用处。

typename关键字告诉编译把一个特殊的名字解释成一个类型,在下列情况下必须对一个name使用typename关键字:

一个唯一的name(可以作为类型理解),嵌套在另一个类型中;

依赖于一个模板参数,就是说模板参数在某种程度上包含这个name,当模板参数是编译器在指认一个类型时便会产生误解,

如:

Base<int>::name a

你无法确定Base<int>::name是一个变量还是一个类型,编译器无法确认,需要更多的信息,所以要在前面添加一个typename关键字。
typename Base<int>::name a

类模板中的类

现在我们来声明一个类型:

template<typename T>
struct Base
{
    struct Normal {};
};

如果模板已经实例化,拥有具体类型,可以选择不使用typename前缀。
void Set()
{
    Base<int>::Normal d;
}

如果还需使用模板类型,则必须使用typename前缀,否则会出现编译错误:类型 从属名称的使用必须以“typename”为前缀

我们可以更好地使用一个别名来使用这个类型

template<typename T> void Set()
{
    using Normal_proxy = typename Base<T>::Normal;
    Normal_proxy n;
}

或者直接使用typename
typename Base<T>::Normal n;

类模板中的类模板

在类模板中使用

一个类模板的嵌套:

template<typename T>
struct Base
{
    template<typename TT>
    struct Nested
    {
        T d1;
        TT d2;
    };
};

类中的类模板需要使用template关键字标识

直接使用范围内的模板类型

template<typename T, typename TT>
static void SS()
{
    using Nested_proxy = typename Base<T>:: template Nested<TT>;

    Nested_proxy d;
    d.d1 = 3;
    d.d2 = 4;

}

或者对类模板进行重新声明
template<typename T, typename TT>
using Nested_proxy = typename Base<T>::template Nested<TT>;

 

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: C# 类模板 类模板嵌套
最后更新:2021年5月19日

JomiXedYu

独游开发者 & 技术美术

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

JomiXedYu

独游开发者 & 技术美术

最新 热点 随机
最新 热点 随机
HLSL对Vulkan的适应性以及伪语义绑定 GPU呈现模式与垂直空白 自研引擎PulsarEngine的Shader编译流程 UE材质Custom节点与HLSL的HACK操作 UE5出现D3D12崩溃报错解决方案 游戏引擎脚本绑定的三种写法与利弊
HLSL对Vulkan的适应性以及伪语义绑定
C#/Java 使用接口实现委托和事件订阅 Adobe Prelude,Pr,AE影视合成/剪辑更有效率的制作 Lua位运算与Flag枚举 MonoSingleton生命周期与移动构造 HSV与RGB互转公式与Color封装 在Unity中多个脚本的Awake、OnEnable的执行顺序问题。
友情链接
  • DorinXL
  • 小博博客
  • 秋橘斋

COPYRIGHT © 2014-2023 雪千渔Blog. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

辽ICP备20006894号-1