定义为模板的别名

typedef to alias of template template

本文关键字:别名 定义      更新时间:2023-10-16

我有一个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答案也提供了一些很好的背景