元组处理中的模板函数错误

时间:2013-08-01 17:06:21

标签: c++ templates c++11 metaprogramming

除主题外:Heterogeneous sequence generatorVariadic template heterogeneous container 在下面的代码中,我尝试使用模板以循环方式处理对象序列 - 元组序列中的当前对象从前一个对象获取参数:

namespace spec
{
    template <int... Idx>
    struct index { };

    template <int N, int... Idx>
    struct sequence : sequence<N - 1, N - 1, Idx...> { };

    template <int... Idx>
    struct sequence<1, Idx...> : index<Idx...> { };
}
template<int N> 
struct A
{
    A() : _N(N) {}
    template<int PrevN> void print_prevN(){std::cout<<PrevN<<std::endl;}
    int _N;
};

template<int N> 
struct B
{
    B(): _N(N){}
    template<int PrevN> void print_prevN(){std::cout<<PrevN<<std::endl;}
    int _N;
};

template<typename...Arg>
class HeterogenousContainer
{
public:

    void process(){process(spec::sequence<sizeof...(Arg)>());}

private:
    std::tuple<Arg...> elements;   
    template <int... Idx> void process(spec::index<Idx...>)//this function generates an error
    {auto aux = { (std::get<Idx>(elements).print_prevN<std::get<Idx-1>(elements)._N>(), 0) ... };}
};
int main()
{  
   HeterogenousContainer<A<3>, B<4>, B<2>> obj;
}

怎么了?

error: expected primary-expression before «)» token

该行中的错误:

{auto aux = { (std::get<Idx>(elements).print_prevN<std::get<Idx-1>(elements)._N>(), 0) ... };}

2 个答案:

答案 0 :(得分:5)

编译器不知道print_prevN是一个函数模板(它是dependent name),因此后续的<>标记被解析为比较运算符。写:

{auto aux = { (std::get<Idx>(elements).template print_prevN<std::get<Idx-1>(elements)._N>(), 0) ... };}
                                       ^^^^^^^^^

答案 1 :(得分:0)

std::get<Idx-1>(elements)._N不是常量表达式,因此不适合作为表达式std::get<Idx>(elements).print_prevN<std::get<Idx-1>(elements)._N>()中的模板参数。