【问题标题】:Mixing Class and Function templates混合类和函数模板
【发布时间】:2019-12-15 15:05:55
【问题描述】:

您好,我正在尝试制作一个 C++ 类模板并让它也构成一个函数模板。它归结为

template <class T> 
class fun{
public:
    template<class U, class V> T add(U, V);
private:
    T data;};

我已经尝试过多种不同的方式重写 cpp 文件(与上面编写的头文件相反)中的签名。我开始认为你不能将一个类作为模板并且让它也有函数模板。你可以吗?

在 cpp 文件中它看起来像这样,我收到一条错误消息,指出我在 cpp 文件中声明的函数“add”与我在头文件中声明的“add”不兼容。

这是我在 cpp 文件中的函数模板。

template <class T, class U> T fun<T>::add(T a, U b){return a+b;}

【问题讨论】:

  • 使用模板时不能有 cpp 文件。全部放在头文件中。
  • @TheQuantumPhysicist 如果您在 cpp 文件中显式实例化您希望支持的版本,您可以(这会消除使用模板的许多好处,但有时会使感觉)。
  • 你们太棒了,非常感谢!
  • @TedLyngmo 我知道伙计...我在晚上 12 点写了那条评论,我在想“哦,我必须提到专业吗?也许不是...我想有人读我的评论会知道我在谈论具体的例子“......我错了:-)我经常做这一切模板专业化的事情来解决循环依赖问题。
  • @TheQuantumPhysicist 永远只有一个 :-)

标签: c++ function class templates mixing


【解决方案1】:

需要在编译时知道类模板定义才能从模板生成类,因此最常用的方法是将定义包含在头文件中。如果您仍想将接口和方法定义分开,您可以使用.tpp 文件。

这是一种通用方法,它从外部唯一的数据类型创建一个类。

即你想要template &lt;class U, class V&gt; T fun&lt;T&gt;::add(U a, V b){return a+b;} 而不是template &lt;class T, class U&gt; T fun&lt;T&gt;::add(T a, U b){return a+b;}

header.h:

template <class T>
class fun{
public:
    template<class U, class V> T add(U, V);
private:
    T data;
};

#include "header.tpp"

header.tpp:

// out of class definition of fun<T>::add<U, V> 
template<class T> // for the enclosing class template
template<class U, class V> // for the member function template
T fun<T>::add(U a, V b) { return a + b; }

【讨论】:

  • 如何使用诸如 fun::add 之类的专门类和方法来做到这一点?
【解决方案2】:

是的,您可以拥有一个包含函数模板的类模板。您的问题是您试图从头文件中删除函数定义。使用模板时,应在头文件中包含函数定义。请注意,只有在使用模板时才能练习这种模式。这是一个例子:

header.h

template <class T>
class fun{
public:
  template<class U, class V> T add(U u, V v) {
          return u + v;
  }
private:
  T data;
};

main.cpp

#include <iostream>
#include "header.h"

int main () {
        fun<int> f;
        std::cout << f.add(10, 12) << std::endl;
}

【讨论】:

  • @ChristianGalleisky 如果这回答了您的问题,请将其标记为答案。这有助于他人并鼓励贡献者
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
相关资源
最近更新 更多