给出以下代码(复杂代码的情况减少):
#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;
}
gcc(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
和其他组合来执行此操作,但在所有情况下,我都无法获得{{的返回类型1}}(参数化成员函数)。
这样做的正确方法是什么?
答案 0 :(得分:2)
using type = typename P::unpack_t<index>;
此处P
是dependent type(因为它是模板参数),这意味着必须明确告知编译器将unpack_t
视为模板。
using type = typename P::template unpack_t<index>;
更多信息: