2

除了主题:异构序列生成器可变模板异构容器 在下面的代码中,我尝试使用模板以循环方式处理对象序列 - 元组序列中的当前对象从前一个对象获取参数:

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) ... };}
4

2 回答 2

5

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

{auto aux = { (std::get<Idx>(elements).template print_prevN<std::get<Idx-1>(elements)._N>(), 0) ... };}
                                       ^^^^^^^^^
于 2013-08-01T17:21:07.803 回答
0

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

于 2013-08-01T17:24:25.983 回答