It probably boils down to this:
template<class T, class U = int>
struct cat {};
template< template<class...> class Animal >
void foo()
{
Animal<int> x; (void)x; // (A)
}
int main()
{
foo<cat>();
}
This little innocent-looking program is accepted by clang++ and g++, but not by MSVC2013 Update 1.
Line (A) is the problematic one: I think in this example it's clear that the template template-parameter Animal
should have two template parameters, when passing the class template cat
.
It seems that clang++ and g++ support the use of default template arguments for this template template-parameter in line (A), while MSVC does not.
I do not know if the Standard requires either of them; see for example
It certainly appears to me that supporting the default template arguments is useful, since (as said in the active issue) the class templates of the Standard Library may have additional template parameters (with default arguments); and you'd need to know those implementation-details if you wanted to use them (directly) as template template-arguments.