包含常量类型模板的类的模板?

时间:2016-07-20 17:09:09

标签: c++ templates

情况

我试图实现一个包含特定数据类型的容器 - 让我们称之为C.容器(让我们称之为B)是A的内部类.I&# 39;我试图声明模板,但遇到了编译器问题,我不确定应该做什么。

的尝试

template <typename T<C>>
class A
{
    class B
    {
    typedef std::unique_ptr<T> containerPtr;
    private:
        containerPtr container;
    }
}

typedef std::shared_ptr<A<std::vector<C>>> somePtr; // Error!

错误是:

  

struct C

     

不允许输入类型名称

template <typename T,U>
class A
{
    class B
    {
    typedef std::unique_ptr<T<U>> containerPtr;
    private:
        containerPtr container; // But does it contain C or some other type now? 
        // We have to do a check - what's the best approach?
    }
}

typedef std::shared_ptr<A<std::vector<C>>> somePtr; 

在这种情况下,最好的方法是什么?

1 个答案:

答案 0 :(得分:5)

如果你知道T是一个存储某种类型C的模板容器的事实,那么你不需要在任何地方指定C,而只能在{{1}上模板化}}:

T

这是有效的,因为template <typename T> class A { class B { /* Use the type name T however you'd like. */ }; }; 必须是完整类型的名称,所以如果您执行类似

的操作
T

然后A<std::vector<int>> T,只要您使用std::vector<int>,它就会特别是T std::vector而不是任何其他类型。< / p>

另一方面,如果您希望客户端提供模板类的名称,然后使用您选择的int强制实例化它,则可以使用模板模板参数,像这样:

C

这会要求用户为您提供模板类型,因此您可以编写类似

的内容
template <template <typename...> class T>
class A {
    class B {
        typedef std::unique_ptr<T<C>> containerPtr;
        /* ... use containerPtr ... */
    };
};

然后,您的A<std::vector> myObject; 模板将使用A类型实例化std::vector