$cat test1.cpp template<typename X,typename Y> struct is_same { static bool const value=false; }; template<typename X> struct is_same<X,X> { static bool const value=true; }; template<typename... X> struct U {}; struct Q { typedef U<int x,int y> C; }; typedef char check[is_same<int,Q::C>::value ? 1 : -1];
$g++ -std=gnu++0x -c test1.cpp && echo $? 0 In 14.3.1, the Standard says: "A template-argument for a template-parameter which is a type shall be a type-id." The test must fail compilation, and Q::C can not be int. $cat test2.cpp template<typename... X> struct U {}; typedef U<int x,int y> B; $g++ -std=gnu++0x -c test2.cpp test2.cpp:2:25: error: invalid type in declaration before ';' token This message is confusing. $cat test3.cpp template<typename X,typename Y> struct U {}; typedef U<int x,int y> A; $g++ -c test3.cpp test3.cpp:2:22: error: wrong number of template arguments (1, should be 2) test3.cpp:1:40: error: provided for 'template<class X, class Y> struct U' test3.cpp:2:25: error: invalid type in declaration before ';' token These messages are confusing. -- Summary: absent or confusing diagnostics of invalid template argument list in implicit template class instantiation Product: gcc Version: 4.6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: roman at binarylife dot net GCC build triplet: x86_64-unknown-linux-gnu GCC host triplet: x86_64-unknown-linux-gnu GCC target triplet: x86_64-unknown-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45113