从模板类继承的C++模板类

问题描述:

我尝试使用从另一个模板类继承的部分专用模板类。我不知道如何去。这里是我的代码:从模板类继承的C++模板类

template < typename T> 
struct SmallContainer 
{ 
    typedef vector<T> type; 
}; 

template<typename CONTAINER, typename T> 
class AnotherClass : public CONTAINER<SmallContainer<T>::type> 
{ // ..... }; 

和gcc保持之前 '<' 令牌

预期模板的名称前 '<' 令牌 预期的 '{' 前 '<' 令牌 预期不合格-ID说我的对象的想法是让AnotherClass成为我想要的任何其他类型的向量的通用容器。

我试着做模板<模板CONTAINER,typename T> etc ...没有任何成功。 有什么想法? 谢谢...

这将工作只是一个模板参数的容器:

template< template<typename> class Container, typename T > 
class AnotherClass 
    : public Container< typename SmallContainer<T>::type > 
{}; 

然而,这不会为任何标准集装箱的工作,因为他们有额外的模板参数(如分配器)。

请注意,在SmallContainer<T>::type之前需要typename,否则编译器会认为它指的是一个值。

+1

可变模板签名将匹配任何具体签名:'template class Container'。 –

+0

@Kerrek SB:除非它有非类型的模板参数,比如'std :: array'。 –

这不能真正做到,无论如何不是STL容器。您可以为每个容器创建一个类似SmallContainer的包装器,以便您可以提供默认参数,但STL容器大部分不共享通用参数。此外,没有办法匹配任意类型的第三方模板。但是,给定包装器或C++ 11别名,您可以将CONTAINER变为模板模板参数。

请注意,没有任何标准库容器模板会采用单个模板参数,它们具有您通常不会使用的默认设置,因此您通常只提供一个,但迄今为止建议的答案都不适用于标准库模板。

让用户指定容器的常用方法是将实际容器作为模板参数,而不仅仅是容器模板。这也是标准库如何指定容器适配器。例如:

template <typename T, typename Container = std::vector<T>> 
class Foo 
{ 
public: 
    typedef Container container_type; 

    void multiply_all() 
    { 
     using std::begin; 
     using std::end; 

     for (auto it(begin(c)), e(end(c)); it != e; ++it) 
     { 
      *it = *it + *it; 
     } 
    } 

private: 
    container_type c; 
}; 

现在,用户可以创建其他实例一样Foo<int, CrazyContainer<int, true, Blue>> x;,你永远不必担心它们的容器的细节。