Your wulf
class template accepts, as its first template template-argument, a class template that takes two type parameters.
Here, you are trying to provide as a corresponding argument a class template (box
) that takes three type parameters:
template <typename A, typename B, typename C>
struct box : wulf<box, C> {};
// ^^^
This is illegal. It doesn't matter if a default type argument is specified for the third type parameter of the box
class template: the type and number of template-arguments must match exactly.
To fix the problem, change the definition of your wulf
class template as follows:
template < template <typename, typename, typename> class FOX, typename bat>
// ^^^^^^^^
struct wulf {};
Here is a live example that shows your code compiling with the above fix.