В стандарте (§14.1) указаны параметры шаблона:
Параметру шаблона шаблона-параметра шаблона разрешено иметь шаблон-аргумент по умолчанию.
Теперь рассмотрим следующий код:
#include <iostream>
using namespace std;
struct A {};
struct B {};
template<typename T = A>
struct X;
template<>
struct X<A> {
static void f() { cout << 1 << endl; }
};
template<>
struct X<B> {
static void f() { cout << 2 << endl; }
};
template< template<typename T = B> class C>
void g() {
C<>::f();
}
int main() {
g<X>();
}
На выходе:
out put: 2
В этом случае шаблон-параметр шаблона C
.
Но я не понимаю, почему C<B>::f()
вызывается внутри g()
.