如何在将函数作为参数传递给文件中.cpp函数模板时声明
How to declare when passing function as parameter to function template in .cpp file?
我试图通过阅读一本书并从该书中锻炼C++自己。
现在我正在尝试在.cpp文件中声明函数模板的实例。我知道我可以在头文件中声明/定义该函数模板,但我仍然对如何在.cpp文件中执行此操作感到好奇。
这是一段微不足道的代码,但演示了我的问题:
// temp_func.h
#ifndef GUARD_temp_func
#define GUARD_temp_func
#include <iostream>
using std::cout; using std::endl;
int addone(int);
int addtwo(int);
template<typename F>
void call_adds(int, F);
#endif
头文件
// temp_func.cpp
#include "temp_func.h"
using std::cout; using std::endl;
int addone(int n)
{
return n + 1;
}
int addtwo(int n)
{
return n + 2;
}
template<typename F>
void call_adds(int n, F f)
{
cout << f(n) << endl;
}
template void call_adds<addone>(int n, F addone);
.cpp文件,显然最后一行不起作用。
编辑:基于N.m.提供的解决方案。
template<int F(int)>
void call_adds(int n)
{
cout << F(n) << endl;
}
template void call_adds<addtwo>(int);
template void call_adds<addone>(int);
您的call_ads
模板需要类型参数。 addone
不是一种类型,而是一个函数。您可以专门针对 int(int)
等类型进行call_adds
,但不能专门用于该类型的单个函数。
您可以使用非类型模板参数创建函数模板:
template <int F(int)>
void call_adds(int n)
{
cout << F(n) << endl;
}
并专门化它:
template<> void call_adds<addtwo> (int n) { ... }
请注意,call_adds
不再有常规函数参数,只有模板参数。
编译器并不真正关心你是在头文件还是在源文件中声明某些内容,只要声明在应该在哪里可见即可。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 为什么我的主文件.cpp不打印头文件中的任何内容
- 生成文件错误 - 找不到文件 - *.cpp
- 如何在文件.cpp gtkmm中声明小部件
- 没有实现文件(.cpp)的派生类
- 如何使用"CMakeLists.txt"中的add_library将整个文件(.cpp,.h等)包含在目录中
- 如何在Linux / Windows操作系统上使用文件*.cpp一步编译下面的代码
- 关于 Linux .so 文件无法链接到主文件.cpp文件
- 文件.cpp从Windows到Linux
- Ubuntu C++ 编译器错误: g++: 错误: 文件.cpp: 没有这样的文件或目录
- 如何将文件.cpp编译为本机编译
- 使用模板类时,似乎无法包含除 main 以外的任何 cpp 文件.cpp
- 无法编译C++文件.cpp。C++98模式
- 为什么C++头文件不需要包含实现文件 (.cpp)
- 如何访问位于独立文件(.cpp)中的非成员函数
- 如何在Visual Studio Code中通过键盘快捷键切换头文件/cpp文件
- 如何将数据从stringstream写入文件(CPP)
- 为什么filestream不把空白写入文件cpp ?