c++ - 如何制作适用于模板类的非模板全局函数?

标签 c++ class templates

这个问题可能不清楚,所以让我用一个例子来解释一下。我有一个模板类 PairContainer<T1, T2>具有公共(public)功能:

//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);
}

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

最佳答案

PairContainer不是一种类型。它是一个模板。这意味着,它不能用在需要类型的地方,特别是在函数定义中。您可以创建一个功能栏,它接受 PairContainer 模板的特定实例,如下所示:

void bar(PairContainer<int, int>, PairContainer<some_class, some_other_class>)

但我怀疑这是你想要的。

制作bar的唯一方法接受任何类型的 PairContainer是通过使它成为一个模板。

顺便说一句,为什么你可以有一个像void foo(PairContainer& pc)这样的结构?在你的类定义里面是因为 PairContainer是简写形式,表示 PairContainer<T1, T2>

关于c++ - 如何制作适用于模板类的非模板全局函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34614225/

相关文章:

java - 默认包中定义的类的可访问性

C++ Unresolved external

c++ - "Error deleting file: Permission denied"在 C++ 中删除

java - 为什么执行代码后bike1,3的值是?

类中的 Java 对象不是 main

c++ - 为什么必须在哪里放置 “template”和 “typename”关键字?

c++ - 在派生构造函数初始化列表中初始化模板

c++ - SFINAE练习时编译报错

c++ - 导入的目标 "Boost::system"包含不存在的路径 "/include"

c++ - 在重构深度嵌套的代码时需要帮助