混合 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; }
你好,我正在尝试制作一个 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; }