除主题外:Heterogeneous sequence generator和Variadic 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) ... };}
答案 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>()
中的模板参数。