我得到了奇怪的编译错误,我无法理解。
考虑简单的测试:
#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
在这个测试中,没有一个模板被实例化,所以为什么我会得到任何错误?
而且,从我读过的关于模板化别名的内容来看,我觉得我在这里正确使用它们。 是这样吗?
感谢。