Это невозможно. Обратите внимание, что это распространенное заблуждение: A<int>
больше не шаблон класса! Поэтому он не подходит для параметра шаблона-шаблона, но должен быть принят с использованием параметра типа:
template<typename C>
struct B {
C c;
};
B< A<int> > b;
Ваш способ использования отдельного параметра в порядке.
Если вы хотите принять A<int>
, но хотите повторно привязать его к другому параметру, вы можете использовать этот шаблон, также используемый стандартными распределителями:
template<typename T>
struct A {
template<typename U>
struct rebind {
typedef A<U> type;
};
};
template<typename C>
struct B {
typename C::template rebind<float>::type c;
};
B< A<int> > b;
Теперь B< A<int> >::c
относится к типу A<float>
. typename
перед C::
сообщает компилятору, что ::type
в конце является типом, а не статическим нетипичным членом. template
после C::
сообщает компилятору, что rebind<float>
является экземпляром шаблона, а не сравнением.