c++11 - C++ parameter pack fails to expand -


i'm playing variadic templates , can't understand why following code won't compile (gcc 4.9.2 std=c++11):

it's example, need similar kind of use in code , fails well:

template<int i> class type{}; template<typename ... tlist> class a{     public:         template<int ...n>             void a(type<n> ... plist){              } }; template<typename ... tlist> class b{ public:     template<int ... n>         void b(type<n> ... plist){             a<tlist...> a;             a.a<n...>(plist ...);         } }; 

and use example:

b<int, int, int> b; b.b<1,7,6>(type<1>(),type<7>(),type<6>()); 

i following error:

file.cpp: in member function ‘void b<tlist>::b(type<n>...)’: file.cpp:58:9: error: expected ‘;’ before ‘...’ token     a.a<n...>(plist ...);          ^ file.cpp:58:24: error: parameter packs not expanded ‘...’:     a.a<n...>(plist ...);                         ^ file.cpp:58:24: note:         ‘n’ 

however following code compiles fine (i removed tlist parameters both classes , adjusted code accordingly):

template<int i> class type{}; class a{     public:         template<int ...n>             void a(type<n> ... plist){              } }; class b{ public:     template<int ... n>         void b(type<n> ... plist){             a;             a.a<n...>(plist ...);         } };   b b; b.b(type<1>(),type<7>(),type<6>()); 

can give me explanation? thanks.

the compiler has no reason believe a.a template; such, mandated interpret < less-than operator. write:

        a.template a<n...>(plist ...);           ^^^^^^^^^ 

in second example, knows a.a template, because type of a there not depend on template parameter.


Comments

Popular posts from this blog

javascript - AngularJS custom datepicker directive -

javascript - jQuery date picker - Disable dates after the selection from the first date picker -