0

我尝试让一个部分专用的模板类继承自另一个模板类。我不知道该怎么做。这是我的代码:

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

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

并且 gcc 在 '<' 之前一直说预期的模板名称 令牌在 '<' 之前应为 '{' '<' 之前的令牌预期不合格 ID 令牌

我的对象的想法是让 AnotherClass 成为我想要的任何其他类型的向量的通用容器。

我试图做 template< template CONTAINER, typename T> 等...没有任何成功。任何的想法 ?谢谢...

4

3 回答 3

3

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

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;,您无需担心其容器的详细信息。

于 2012-05-18T20:41:07.330 回答
2

这适用于只有一个模板参数的容器:

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

但是,这不适用于任何标准容器,因为它们具有额外的模板参数(如分配器)。

请注意,typename在此之前需要,SmallContainer< T >::type否则编译器将假定它引用了一个值。

于 2012-05-18T18:30:00.463 回答
0

这不能真正做到,无论如何都不能用 STL 容器。您可以为每个容器创建一个像 SmallContainer 这样的包装器,以便您可以提供默认参数,但 STL 容器在大多数情况下不共享公共参数。此外,无法匹配任意类型的第三方模板。但是,给定包装器或 C++11 别名,您可以将 CONTAINER 转换为模板模板参数。

请注意,没有一个标准库容器模板采用单个模板参数,它们具有您通常不使用的默认值,因此您通常只提供一个,但到目前为止,没有一个建议的答案适用于标准库模板。

于 2012-05-18T18:31:53.203 回答