我试图实现一个包含特定数据类型的容器 - 让我们称之为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;
在这种情况下,最好的方法是什么?
答案 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
。