2015-06-13 3 views
3

Рассмотрим код:шаблона параметр шаблона частичной специализации 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, который не поддерживает псевдонимов шаблонов, что, как я понял, является решением.

ответ

3

Проблема заключается в том, что A принимает параметр шаблона шаблона, который принимает два типа:

template<template<typename,typename> Container> 
class A { 

Но std::map не принимает два типа. Это занимает четыре:

template< 
    class Key, 
    class T, 
    class Compare = std::less<Key>, 
    class Allocator = std::allocator<std::pair<const Key, T> > 
> class map; 

Так что это одна проблема. Вы должны обобщить свой шаблон на следующее (также отметить недостающую class ключевое слово):

template <template <typename...> class Container> 
class A { ... }; 

Но даже с этим, в лучшем случае вы могли бы полностью специализироваться явно функцию-член, вы не можете частично специализировать его:

template <> 
template <> 
void A<std::map>::Foo<>(std::map<U, V>*, U) { ... } 
+0

Я отредактировал этот вопрос, я думаю, вы меня неправильно поняли, я пытаюсь специализировать контейнер, а не функцию-член. Кроме того, карта здесь имеет два специализированных параметра: T = V и Compare = Comp, поэтому шаблон должен принимать только два параметра. –

+0

@OmerRosler 'map' принимает 4 параметра. Тот факт, что два из них дефолт, не имеет значения. Вы должны [сделать псевдоним] (http://coliru.stacked-crooked.com/a/9b4de514a9de7f3f). – Barry

+0

Я думаю, что aliasing - это именно то, что я искал, но как я могу создать псевдоним шаблона? Нечто вроде template template использование M = map

Смежные вопросы