混合类和函数模板
Mixing Class and Function templates
嗨,我正在尝试制作一个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;}
在编译时需要知道类模板定义才能从模板生成类,因此最常见的方法是将定义包含在头文件中。如果仍希望将接口和方法定义分开,则可以使用.tpp
文件。
下面是从外部唯一数据类型创建类的通用方法。
即你想要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;}
标题.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; }
是的,您可以拥有包含函数模板的类模板。您的问题是您正在尝试从头文件中删除函数定义。使用模板时,应在头文件中包含函数定义。请注意,只有在使用模板时,您才能练习这种模式。下面是一个示例:
标题.h
template <class T>
class fun{
public:
template<class U, class V> T add(U u, V v) {
return u + v;
}
private:
T data;
};
主.cpp
#include <iostream>
#include "header.h"
int main () {
fun<int> f;
std::cout << f.add(10, 12) << std::endl;
}
相关文章:
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 将重载的成员函数传递给函数模板
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 具有常量引用参数的函数模板专用化
- std::span<const T> 作为函数模板中的参数
- 如何编写一个完美的缩写函数模板?
- 仅在函数模板中为那些定义了函数的类型执行函数
- 如何在C++中伪造虚拟可变参数函数模板?
- 以下代码中的函数模板有什么问题?
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- 将显式实例化的函数模板与转换匹配
- 使用定义函数模板别名
- 函数模板返回类型
- 混合类和函数模板
- 函数模板与重载混合
- 在构造函数中混合可变参数模板和初始值设定项列表
- 将构造函数与固定参数混合,将构造函数与构造函数模板混合在一起
- 混合函数模板和普通函数
- 在只有模板化返回类型的函数模板中混合模板专门化和enable_if