如何在 .cpp 文件中实现模板功能?
函数.h
class f{
void f1();
template<typename T>
void f3(std::vector<T> &){
//Implementation
}
}
函数.cpp
void f::f1(){
//code
}
以下应该工作。我修复了语法并从头文件中删除了 f3 定义。此外,默认情况下,class访问说明符是private这样的,因此f3(std::vector<T>&)从 main 访问是非法的。另请参阅 Jarod42 关于在标头中实现模板的答案。
//function.h
#include <vector>
class F {
public:
void f1();
template<typename T>
void f3(std::vector<T> &);
};
#include "function.tpp"
//function.tpp
template<typename T>
void F::f3(std::vector<T> &){
//Implementation
}
//main.cc
int main() {
std::vector<int> v;
F f;
f.f3(v);
}
简单地:
// function.cpp
template<typename T>
void f::f3(std::vector<T> &){
//Implementation
}
但是看看为什么模板只能在头文件中实现?
如果你有模板方法,它的定义必须在模板被实例化的地方可见。这意味着在 99% 的情况下,模板定义必须在头文件中。
在特殊情况下有一种解决方法。您可以通过在 cpp 文件中列出此类型来强制实例化特定类型的模板。在这种情况下,您将仅限于这种特定类型。
foo.h
#include <vector>
class f{
public:
void f1();
template<typename T>
void f3(std::vector<T> &);
};
foo.cpp
#include "foo.h"
#include <iostream>
#define LOG std::cout << __PRETTY_FUNCTION__ << '\n'
void f::f1()
{
LOG;
}
template<typename T>
void f::f3(std::vector<T> &)
{
LOG;
}
template void f::f3<int>(std::vector<int> &);
template void f::f3<double>(std::vector<double> &);
主文件
#include "foo.h"
#include <iostream>
int main()
{
std::vector<int> bar{ 1, 3, 5, 6 };
f foo;
foo.f1();
foo.f3(bar);
return 0;
}
请注意,新的 C++ 功能即将推出。在C++20 中引入了模块。根本没有更多的头文件。