2013-08-01 144 views
2

除了主题: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) ... };} 
+3

我们怎么知道?没有错误消息。 –

+0

抱歉)))增加了错误 – gorill

回答

5

编译器不知道print_prevN是一个函数模板(这是一个dependent name),所以后续<>令牌解析为比较运算符。写:

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

它的工作)))谢谢! – gorill

0

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

+0

如果用constatnt替换std :: get (elements)._ N,比方说3,将会是相同的错误 – gorill