假设我有一个在中声明和定义的非类型模板函数f(int)
(参数<int dim>
)。在我进一步添加了一个特化 for ,然后我显式地实例化了and的模板函数。template.h
template.cpp
template.cpp
dim = 2
dim = 1
dim = 2
文件编译正常,但在链接过程中出现错误:
Undefined symbols for architecture x86_64:
"void f<2>(int)", referenced from:
_main in main-2AW7ED.o
ld: symbol(s) not found for architecture x86_64
但是,如果我inline
从模板专业化中删除关键字(见下面的标记),整个事情就会按预期工作。所以我的问题来了:
inline
当它适用于基本模板时,为什么它不适用于专用模板,而其他所有东西都可以编译并正常工作?
主文件
#include <iostream>
#include "template.h"
using namespace std;
int main(int, char** )
{
f<1>(456);
f<2>(789);
}
模板.h
template <int dim> void f(int src);
模板.cpp
#include <iostream>
#include "template.h"
using namespace std;
template <int dim> inline
void f(int src)
{
cout << "src = " << src << endl;
cout << "dim (template) = " << dim << endl;
}
template <> inline // <== if I remove this "inline", everything works as expected
void f<2>(int src)
{
cout << "src = " << src << endl;
cout << "dim (fixed) = " << 2 << endl;
}
template void f<1>(int);
template void f<2>(int);
PS:我用g++和clang++的命令clang++ -o tmpl template.cpp main.cpp
编译。