2013-11-19 3 views
1

Я следующий шаблонШаблон псевдоним для класса члена шаблона

template<class F> 
struct A{ 
    template<int N> 
    struct B{ 
    using type = int; 
    }; 
}; 

Я хотел бы сделать шаблон псевдоним, однако:

//doesn't compile. 
template<class F, int N > 
using alias_A = typename A<F>::B<N>::type; 

GCC: 
question.cpp:12:36: error: expected ';' before '::' token 
using alias_A = typename A<F>::B<N>::type; 
            ^
question.cpp:12:36: error: 'type' in namespace '::' does not name a type 

При отладке я найти:

//does compile 
struct C{}; 
using alias_B = typename A<C>::B<0>::type; 

Может кто-нибудь указать, что я делаю неправильно? Я чувствую, что мне не хватает чего-то очевидного.

+0

Позднее примечание: Кланг дает более полезное ключевое слово 'error: use 'template, чтобы лечить' B 'в качестве зависимого имени шаблона' ([ссылка] (http://coliru.stacked-crooked.com/a/1c8d3c351c8c6724)) –

ответ

4

Вы должны сказать C++ что это внутренний тип B<N> шаблон:

template<class F, int N > 
using alias_A = typename A<F>::template B<N>::type; 

В этом случае компилятор анализирует то, что вы написали, как operator<, а не в качестве открывающей скобки для параметра шаблона ,

This post дает исчерпывающее изложение того, когда и зачем вам это нужно.

Смежные вопросы