如何在.cpp中实现属于非模板类的模板函数
How to implement template function that belongs to non template class in .cpp
如何在.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中引入了模块。根本没有更多的头文件。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 如何在.cpp中实现属于非模板类的模板函数
- 如何找出成员函数属于哪个类
- 调用不属于基类的派生类函数的最佳方法是什么?
- 通过可变参数模板应用属于其他类的函数
- 如何在C++中的另一个模板函数中使用属于模板化类的嵌套类型?
- 哪个范围属于课堂定义的朋友函数
- 如何查看 c++ 中属于 'math.h' 的所有函数?
- 私有结构(在类中定义)不能用作属于同一类的函数的返回类型吗
- 当函数属于类时,未解析的重载函数类型
- 如何使用 windbg 在不属于任何类的函数声明上设置断点
- 你能使用 googlemock 对不属于类的函数设置期望吗?
- C++:如何调用属于同一类的成员函数指针
- 函数,这些函数接收属于其他文件中类的对象
- 如何让一个函数参数接受不同的对象(但属于同一类),并访问传递给w/n函数调用的w/n对象的函数
- 流插入/提取操作符重载函数的原型属于哪里?
- 是否可以声明一个属于模板类的单一实例化的函数?
- 如何在emacs中查找不属于类的C函数
- 如何在Linux中找到一个函数在c++中属于哪个库