定义为模板的别名
typedef to alias of template template
我有一个traits类AttributeTraits,它使用一个智能指针模板类MySmartPointer:
template<typename T>
class MySmartPointer {};
template<template <typename> class SP = MySmartPointer>
struct AttributeTraits {
template <typename T>
using SmartPointerClass = SP<T>;
};
AttributeTraits使用别名来保存它所拥有的模板类。现在,我需要获得trait类的Attribute类将使用智能指针类的类型定义/别名,例如:
template <typename Traits>
struct Attribute {
typedef typename Traits::SmartPointerClass<int> SmartPointerType; // error: non-template 'SmartPointerClass' used as template
using SmartPointerType2 = typename Traits::SmartPointerClass<int>; // error: expected ';' before '<' token
using SmartPointerType3 = Traits::SmartPointerClass<int>; // error: non-template 'SmartPointerClass' used as template
};
这是你的依赖类是模板的时候之一,所以你在定义别名时必须使用尴尬的template
语法:
template <typename Traits>
struct Attribute {
typedef typename Traits::template SmartPointerClass<int> SmartPointerType;
using SmartPointerType2 = typename Traits::template SmartPointerClass<int>;
using SmartPointerType3 = typename Traits::template SmartPointerClass<int>;
};
关于何时需要template
关键字的描述,请参阅本文档:
依赖名称的
template
消歧器
类似地,在类的成员的从属名称当前实例化不被视为模板名,除非使用消歧关键字template
,除非已经使用了作为模板名建立
这个StackOverflow答案也提供了一些很好的背景
相关文章:
- 部分定义/别名模板模板参数
- 使用定义函数模板别名
- 在Qt中注册自定义元类型的别名类型
- 使用外部定义的模板类型作为模板参数的更通用模板的模板别名
- 参数化类的别名(或类型定义)内部类
- 为什么此模板定义了一组匹配void的别名类型
- 如何定义别名以通过结构访问枚举类成员
- C++ 中模板化别名的类型定义
- 别名 私有子结构中的静态成员的定义
- 将别名定义为操作员
- 使用自定义deleter类型定义std::shared_ptr的别名
- 如何使用别名声明模板化函数类型定义
- C++对类/结构中定义的公共别名(typdef/using)的循环依赖
- 在不键入别名类型的完整声明的情况下,无法从类模板定义中访问类型的类型别名
- 是否可以将类型别名定义为constexpr函数
- 是否可以为模板模板参数定义别名
- C 使用模板为结构定义别名
- 定义类型别名时出现语法错误
- 在 C++11 中使用严格的混叠时,它是否定义为 _write_ 到 char*,然后从别名的非 char* 读取_
- 条件类型别名定义