2017-02-17 15 views
2

Как исправить строку using?Шаблон шаблона Unzip из набора типов

test_temp.cpp:

#include <memory> 
template <typename A, typename B, template<typename> class C> 
class X {}; 

template <typename A1, typename B1, template<typename> class C1> 
class Type_bundle { 
public: 
    typedef A1 A; 
    typedef B1 B; 
    template<typename T> using C = C1<T>; 
}; 

template <typename T_b> 
using X_b = X<typename T_b::A, typename T_b::B, typename T_b::template C>; 


int main() { 
    typedef Type_bundle<int,float,std::allocator> Ttb; 
    X_b<Ttb> x; 
} 

Ошибка с лязгом ++

test_temp.cpp:14:63: error: expected an identifier or template-id after '::' 
using X_b = X<typename T_b::A, typename T_b::B, typename T_b::template C>; 
                 ~~~~~^ 

Почему это не работает?

ответ

3

Когда вы пишете:

template <typename T_b> 
using X_b = X<typename T_b::A, typename T_b::B, typename T_b::template C>; 
//            ~~~~~~~~~ 

Это говорит о том, что следует будет имя типа. Но T_b::template C не является типом, это шаблон, поэтому эта конструкция недопустима. Вы бы использовали эту конструкцию, если бы вы перешли параметры в C, например typename T_b::template C<D>. Там необходимы как typename, так и template.

То, что вы хотите, это просто:

template <typename T_b> 
using X_b = X<typename T_b::A, typename T_b::B, T_b::template C>; 

typename Нет.

-1

компилируется:

#include <memory> 
template <typename A, typename B, template<typename> class C> 
class X {}; 

template <typename A1, typename B1, template<typename> class C1> 
class Type_bundle { 
public: 
    typedef A1 A; 
    typedef B1 B; 
    template<typename T> using C = C1<T>; 
}; 

template <typename T_b> 
using X_b = X<typename T_b::A, typename T_b::B, 
       T_b::template C >; 
int main() { 
    typedef Type_bundle<int,float,std::allocator> Ttb; 
    X_b<Ttb> x; 
} 
+0

Я не знаю, почему это работает. Но после использования различных комбинаций 'typename T',' template' и т. Д., Я получаю это. Если шаблон становится более сложным, такой поиск грубой силы просто интересен. –