如何在.cpp中实现属于非模板类的模板函数

How to implement template function that belongs to non template class in .cpp

本文关键字:函数 属于 cpp 实现      更新时间:2023-10-16

如何在.cpp文件中实现模板函数?

函数.h

class f{
void f1();
template<typename T>
void f3(std::vector<T> &){  
//Implementation
}
}

功能.cpp

void f::f1(){ 
//code
}

以下内容应该有效。我修复了语法并从头文件中删除了 f3 定义。此外,默认情况下class访问说明符是private因此从 main 访问f3(std::vector<T>&)是非法的。 另请参阅 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 文件中列出此类型来强制实例化特定类型的模板。在这种情况下,您将仅限于此特定类型。

福.H

#include <vector>
class f{
public:
void f1();
template<typename T>
void f3(std::vector<T> &);
};

傅.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> &);

主.cpp

#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中引入了模块。根本没有更多的头文件。