我正在尝试实现一个包含特定数据类型的容器 - 让我们称之为C.容器(我们称之为B)是A的内部类.我正在尝试声明模板但是遇到了编译问题我不知道该怎么做.
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!
Run Code Online (Sandbox Code Playgroud)
错误是:
结构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;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,最好的方法是什么?
如果你知道一个事实T是一个存储某种类型的模板容器C,那么你不需要在C任何地方指定,只能模板化T:
template <typename T>
class A {
class B {
/* Use the type name T however you'd like. */
};
};
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为T必须是完整类型的名称,所以如果你做了类似的事情
A<std::vector<int>>
Run Code Online (Sandbox Code Playgroud)
然后T是std::vector<int>任何时候你使用T它会具体为std::vector的int不是任何其他类型的S和.
另一方面,如果您希望客户端提供模板类的名称,然后根据您的选择强制实例化它C,则可以使用模板模板参数,如下所示:
template <template <typename...> class T>
class A {
class B {
typedef std::unique_ptr<T<C>> containerPtr;
/* ... use containerPtr ... */
};
};
Run Code Online (Sandbox Code Playgroud)
这要求用户给你一个模板类型,所以你要写一些类似的东西
A<std::vector> myObject;
Run Code Online (Sandbox Code Playgroud)
然后,您的A模板将std::vector使用该类型进行实例化C.