我正在尝试通过阅读一本书并从那本书中练习来学习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文件,显然最后一行不起作用。
修改 基于由上午提供的解决方案。
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);
答案 0 :(得分:1)
您的call_ads
模板需要一个类型参数。 addone
不是类型,它是一个函数。您可以为call_adds
类型专门设置int(int)
,但不能为该类型的单个函数专门设置。
您可以使用非类型模板参数创建函数模板:
template <int F(int)>
void call_adds(int n)
{
cout << F(n) << endl;
}
并专门化:
template<> void call_adds<addtwo> (int n) { ... }
请注意,call_adds
不再具有常规函数参数,只有模板参数。
编译器并不关心你是否在头文件或源文件中声明某些东西,只要声明在应该的位置可见。