2016-08-29 4 views
2

私はMySmartPointer、スマートポインタテンプレートクラスを使用する特性クラス、AttributeTraitsを得た:テンプレートテンプレートのエイリアスへのtypedef

template<typename T> 
class MySmartPointer {}; 

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

AttributeTraitsそれが持っているテンプレートクラスを保持するためにエイリアスを使用しています。 は今、私はそのような形質クラスは、スマートポインタクラスにのtypedef /エイリアスを使用します取得する属性クラスを、必要とする:

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つのオプションのどれも...

答えて

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

参照this documentationあなたがtemplate KEYWOを必要とするときの説明については、 RD:


同様に依存名のtemplateディスアンビギュエータ、 テンプレート定義では、 現在のインスタンスのメンバではありません依存名は ない限り、テンプレート名と見なされていません曖昧さ回避キーワードtemplateが使用されるか、または、それが既にテンプレート名として確立 た場合を除き

This StackOverflow Answerもいくつかの良いBAを提供していますckground。

関連する問題