typedef to template template

时间:2016-08-29 14:45:19

标签: c++ c++11 alias typedef template-templates

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

template<typename T>
class MySmartPointer {};

template<template <typename> class SP = MySmartPointer>
struct AttributeTraits {
    template <typename T>
    using SmartPointerClass = SP<T>;
};

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
};

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

1 个答案:

答案 0 :(得分: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>; 
};

有关何时需要template关键字的说明,请参阅this documentation

  

依赖名称的template消歧器
  同样,在一个   模板定义,不是其成员的从属名称   除非,当前实例化不被视为模板名称   使用消歧关键字template或除非已经使用   建立为模板名称

This StackOverflow Answer也提供了一些很好的背景。