首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从模板类继承的C++模板类

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

Stack Overflow用户
提问于 2012-05-19 02:28:09
回答 3查看 241关注 0票数 0

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

代码语言:javascript
运行
复制
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<模板容器,类型名称T>等...百无所成。有什么想法吗?谢谢..。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-19 02:30:00

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

代码语言:javascript
运行
复制
template< template< typename > class Container, typename T >
class AnotherClass
  : public Container< typename SmallContainer< T >::type >
{};

然而,这对任何标准容器都不起作用,因为它们有额外的模板参数(如分配器)。

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

票数 2
EN

Stack Overflow用户

发布于 2012-05-19 04:41:07

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

代码语言:javascript
运行
复制
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;,您再也不需要担心容器的细节了。

票数 3
EN

Stack Overflow用户

发布于 2012-05-19 02:31:53

这是不可能做到的,至少用STL容器是不行的。您可以为每个容器创建一个类似SmallContainer的包装器,这样您就可以提供默认参数,但是STL容器在大多数情况下并不共享公共参数。此外,没有办法匹配任意类型的第三方模板。但是,在给定包装器或C++11别名的情况下,您可以将容器转换为模板模板参数。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10657900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档