混合 Class 和函数模板

Mixing Class and Function templates

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

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

我试过用许多不同的方式重写 cpp 文件中的签名(与上面写的头文件相反)。我开始认为您不能将 class 作为模板并使其具有函数模板。可以吗?

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

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

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

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

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

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

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

即你想要 template <class U, class V> T fun<T>::add(U a, V b){return a+b;} 而不是 template <class T, class U> T fun<T>::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; }