Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Шаблон в качестве параметра шаблона

#cpp #шаблоны_с++


Как правильно передавать шаблон в качестве параметра другому шаблону? 

template < typename T >
struct A{};

template < template < typename > class C >
struct B{}; 

typedef A < int > A_int;
typedef A < float > A_float;

typedef B < A_float > B_A_float; // error C3200: 'A_float' : invalid template argument
for template parameter 'C', expected a class template
typedef B < A < float > > B_A_float; // error C3200: 'A' : invalid template argument
for template parameter 'C', expected a class template
typedef B < A > B_A_float; // компилируется но бесполезно


необходимо использовать в шаблоне разные специализации шаблона, но компилятор позволяет
вставить только сам класс
    


Ответы

Ответ 1



Если Вы хотите просто передать шаблону какой-то тип, то в качестве параметра шаблона надо использовать параметр-тип: template struct foo { X x; }; // ^ параметр-тип. ^ используется как тип. foo obj; // ОК, передали тип int, получили поле "int x;" foo> obj; // ОК, передали тип vector, получили поле "vector x;" foo // не ок. "vector x;" не компилируется А если же надо передать шаблону шаблон, то параметром должен быть параметр-шаблон: template class X> struct foo { X x; }; // ^ параметр-шаблон. ^ используется как шаблон. foo obj; // ОК, передали шаблон vector, получилось поле "vector x;" foo obj; // не ок. "int x;" не компилируется foo> obj; // не ок. "vector x;" не компилируется

Ответ 2



Согласно C++ стандарту (14.3.3 Template template arguments) 1 A template-argument for a template template-parameter shall be the name of a class template or an alias template, expressed as id-expression. When the template-argument names a class template, only primary class templates are considered when matching the template template argument with the corresponding parameter; partial specializations are not considered even if their parameter lists match that of the template template parameter. Вы же пытаетесь в качестве шаблонного аргумента использовать аргумент тип, и, естественно, компилятор выдает сообщение об ошибке. То есть вы не передаете в качестве аргументов шаблоны, а передаете конкретные типы такие, как, например, A или A Простой пример использования шаблонного параметра шаблона: #include template struct A { T x; }; template class C = A> struct B { C c; }; int main() { B b1 = { { 10 } }; B b2 = { { 20.20 } }; std::cout << b1.c.x << std::endl; std::cout << b2.c.x << std::endl; } Вывод программы на консоль: 10 20.2

Комментариев нет:

Отправить комментарий