C ++模板模板别名提供有线编译错误

时间:2014-10-30 12:40:04

标签: c++ c++11 template-meta-programming

我得到了奇怪的编译错误,我无法理解。

考虑简单的测试:

#include <cstdlib>
#include <tuple>
#include <utility>

template<size_t i, typename... args_t>
struct for_each_impl
{
    using this_type = typename std::tuple_element<i, std::tuple<args_t...>>::type;

    using prev_type = for_each_impl<i - 1, args_t...>;

    template<template<typename> class func_t>
    using instantiate = typename func_t<this_type>::type;
    //Note: I stripped recursion here to keep it simple
};

template<typename... args_t>
struct for_each_impl<0, args_t...>
{
    using this_type = typename std::tuple_element<0, std::tuple<args_t...>>::type;

    template<template<typename> class func_t>
    using instantiate = typename func_t<this_type>::type;
};

template<typename... args_t>
struct for_each
{
    using prev_type = for_each_impl<sizeof...(args_t) - 1, args_t...>;

    template<template<typename> class func_t>
    using instantiate = 
        typename prev_type::instantiate<func_t>; // <<--- error
};

int main(int argc, char** argv)
{
    return 0;
}

使用g ++(Ubuntu 4.8.2-19ubuntu1)4.8.2进行编译,我收到此错误:

g++    -c -g -std=c++11 -MMD -MP -MF "build/Debug/GNU-Linux-x86/main.o.d" -o build/Debug/GNU-Linux-x86/main.o main.cpp
main.cpp:34:34: error: expected ‘;’ before ‘<’ token
   typename prev_type::instantiate<func_t>;
                                  ^
main.cpp:34:34: error: expected unqualified-id before ‘<’ token

在这个测试中,没有一个模板被实例化,所以为什么我会得到任何错误?

而且,从我读过的关于模板化别名的内容来看,我觉得我在这里正确使用它们。 是这样吗?

感谢。

0 个答案:

没有答案