typedef到模板模板的别名

o.z*_*o.z 2 c++ alias typedef template-templates c++11

我有一个traits类,AttributeTraits,它使用智能指针模板类MySmartPointer:

template<typename T>
class MySmartPointer {};

template<template <typename> class SP = MySmartPointer>
struct AttributeTraits {
    template <typename T>
    using SmartPointerClass = SP<T>;
};
Run Code Online (Sandbox Code Playgroud)

AttributeTraits使用别名来保存它拥有的模板类.现在,我需要获取特征类的Attribute类将使用typedef/alias到智能指针类,例如:

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
};
Run Code Online (Sandbox Code Playgroud)

但上面的3个选项都不起作用......

And*_*dyG 6

这是您的依赖类是模板的那个时代之一,因此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>; 
};
Run Code Online (Sandbox Code Playgroud)

有关何时需要关键字的说明,请参阅此文档template:

template依赖名称的消歧器
类似地,在模板定义中,除非使用消歧关键字template或除非已将其设置为模板名称,否则不将当前实例化的成员的从属名称视为模板名称

这个StackOverflow Answer还提供了一些很好的背景知识.