![](/img/trans.png)
[英]C++ partial template specialization and class inheritance in template parameter
[英]Template template parameter partial specialization c++
考慮一下代碼:
template<template<typename,typename> class Container>
class A {
template<class U, class Allocator>
void Foo(Container<U, Allocator>*, U);
};
現在我想專門研究A
在這種情況下,Container是一個已知Value和Comparator的地圖,並在這種情況下創建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.
我已經在線查看並且只發現了類似的問題,但我找不到一種方法來僅指定模板模板的部分模板參數列表。 有辦法嗎?
編輯:唯一的問題是,在給出模板類時,部分特化是使其表現為具有其余參數的模板。 這里嘗試將map<*,Known1,Known2,*>
視為僅有2個參數的模板(可以真正用作A
的模板模板參數)。
編輯2:我必須使用的編譯器是GCC 4.1.2,它不支持模板別名,據我所知,這是一個解決方案。
問題是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) { ... }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.