我有一个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个选项都不起作用......
答案 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也提供了一些很好的背景。