问题可能不清楚,所以让我解释一个例子。我有一个带有公共函数的模板类PairContainer<T1, T2>
:
//somewhere in PairContainer class definition
void foo(PairContainer& pc)
{
//do something
}
现在我想创建一个可以像这样调用的函数bar
:
//somewhere in main...
PairContainer<int, int> pc1;
PairContainer<some_class, some_other_class> pc2;
bar(pc1, pc2); //is equivalent to pc1.foo(pc2)
我该怎么做?我不能这样做:
void bar(PairContainer& pc1, PairContainer& pc2)
{
pc1.foo(pc2);
}
因为这不会编译(“缺少模板参数”)。
答案 0 :(得分:4)
PairContainer
不是一种类型。这是一个模板。这意味着,它不能用于期望类型的地方,特别是在函数定义中。您可以创建一个功能栏,接受PairContainer模板的特定实例,如下所示:
void bar(PairContainer<int, int>, PairContainer<some_class, some_other_class>)
但我怀疑这是你想要的。
让bar
接受任何类型PairContainer
的唯一方法是将其设为模板。
顺便说一下,你在类定义中有void foo(PairContainer& pc)
这样的结构的原因是因为PairContainer
是一个简写,只是意味着PairContainer<T1, T2>
答案 1 :(得分:2)
如果你想在PairContainer
中接受带有任何模板参数的foo
,那么它需要是一个模板函数,其中包含pc
参数的模板参数:
template <typename Y1, typename Y2>
void foo (PairContainer<Y1, Y2>& pc)
{
}
然后bar
需要是一个模板函数,其中包含PairContainer
的模板参数:
template <typename X1, typename X2, typename Y1, typename Y2>
void bar(PairContainer<X1,X2>& pc1, PairContainer<Y1,Y2>& pc2)
{
pc1.foo(pc2);
}
答案 2 :(得分:1)
您要么必须指定要采用的<Directory>
类型,要么使用模板。
您可以将函数的两面都设为不同的模板类型
RewriteOptions Inherit
但这适用于任何两种类型。要将其限制为仅两个不同的PairContainer
s,您可以使用
template<typename T, typename U>
void bar(T& pc1, U& pc2)
{
pc1.foo(pc2);
}