Рассмотрим код:шаблона параметр шаблона частичной специализации C++
template<template<typename,typename> class Container>
class A {
template<class U, class Allocator>
void Foo(Container<U, Allocator>*, U);
};
Теперь я хочу специализироваться A
в случае контейнер представляет собой карту, где, как известно, ценен и компаратор, и создать определение Foo
в этом (без специализации Foo
). Я попытался это:
template<typename V, typename Comp> template<class U, class Allocator>
void A<std::map<typename, V, Comp, typename>>::Foo(map<U, V, Comp, Allocator>*, U) {...}
Но я получаю ошибку компиляции: C3200: 'std::map<int,V,Comp,int>' : invalid template argument for template parameter 'Container', expected a class parameter.
Я посмотрел в Интернете и только нашел подобные вопросы, но я не мог найти способ указать только частичный список параметров шаблона шаблон шаблона. Есть ли способ сделать это?
EDIT: Единственная проблема заключается в том, что предоставление частичной специализации класса шаблонов - заставить его вести себя как шаблон с оставшимися параметрами. Здесь вы можете подумать о map<*,Known1,Known2,*>
как шаблон только из 2 аргументов (который можно реально использовать в качестве параметра шаблона шаблона A
).
EDIT 2: Компилятором, которым я должен пользоваться, является GCC 4.1.2, который не поддерживает псевдонимов шаблонов, что, как я понял, является решением.
Я отредактировал этот вопрос, я думаю, вы меня неправильно поняли, я пытаюсь специализировать контейнер, а не функцию-член. Кроме того, карта здесь имеет два специализированных параметра: T = V и Compare = Comp, поэтому шаблон должен принимать только два параметра. –
@OmerRosler 'map' принимает 4 параметра. Тот факт, что два из них дефолт, не имеет значения. Вы должны [сделать псевдоним] (http://coliru.stacked-crooked.com/a/9b4de514a9de7f3f). – Barry
Я думаю, что aliasing - это именно то, что я искал, но как я могу создать псевдоним шаблона? Нечто вроде template template использование M = map –