2014-06-03 2 views
1

Учитывая следующий код (уменьшенное положение кода complexer):Получение возвращаемого типа функции члена параметрической в ​​невычисленных контекстах

#include <type_traits> 

template<unsigned i> 
struct index_st 
{ 
    using type = void; 
}; 

struct pack 
{ 
    template<unsigned index> 
    static typename index_st<index>::type get(); 

    template<unsigned index> 
    using unpack_t = decltype(get<index>()); 
}; 

template<typename P, unsigned index> 
struct unpack 
{ 
    using type = typename P::unpack_t<index>; 
}; 

int main() 
{ 
    unpack<pack, 3> u; 
} 

следующей ошибка компиляции брошенных G (4.8.1):

sample.cpp:21:38: error: expected ';' before '<' token 
    using type = typename P::unpack_t<index>; 
            ^
sample.cpp:21:38: error: expected unqualified-id before '<' token 
sample.cpp: In instantiation of 'struct unpack<pack, 3u>': 
sample.cpp:26:21: required from here 
sample.cpp:21:38: error: 'typename pack::unpack_t' names 'template<unsigned int index> using unpack_t = decltype (get<index>())', which is not a type 

Моя получает Цель СССР типа, возвращаемый pack::get<index>() внутри unpack структуры.

Я пытался сделать это с и без using заявления, используя std::result_of и другие комбинации, но и во всех случаях, я был не в состоянии получить тип возвращаемого get (параметрическая функция-член).

Каков правильный способ?

+1

Добавить 'template' ключевое слово:' используя тип = TYPENAME P :: шаблон unpack_t ; '. – Constructor

+0

@ FilipRoséen-refp Еще 30 бонусов, чтобы иметь возможность инсталляции! – Yakk

+0

@ Якк это на самом деле только 3 ответа в [тег: C++], что требуется, подсчет голосов медленен при обновлении; Я работаю над этим! –

ответ

2
using type = typename P::unpack_t<index>; 

Здесь P является dependent type (так как это параметр шаблона), то это означает, что компилятор должен явно быть сказано, чтобы рассматривать unpack_t в качестве шаблона.

using type = typename P::template unpack_t<index>; 

Дополнительная информация:

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