如何创建一个适用于模板类的非模板全局函数?

时间:2016-01-05 14:36:31

标签: c++ class templates

问题可能不清楚,所以让我解释一个例子。我有一个带有公共函数的模板类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);
}

因为这不会编译(“缺少模板参数”)。

3 个答案:

答案 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);
}