【发布时间】:2014-10-21 04:47:42
【问题描述】:
函数.h:
#pragma once
#include <iostream>
template<class T> void TemplatedFunction(T* p) {}
template<> void TemplatedFunction<float>(float* p) {}
template<> void TemplatedFunction<char>(char* p) {}
函数.cpp:
#include "Functions.h"
void Test()
{
TemplatedFunction<float>(NULL);
TemplatedFunction<char>(NULL);
}
main.cpp:
#include "Functions.h"
void Test();
int main()
{
Test();
return 0;
}
构建错误:
main.obj : error LNK2005: "void __cdecl TemplatedFunction<float>(float *)" (??$TemplatedFunction@M@@YAXPAM@Z) already defined in Functions.obj
main.obj : error LNK2005: "void __cdecl TemplatedFunction<char>(char *)" (??$TemplatedFunction@D@@YAXPAD@Z) already defined in Functions.obj
我知道解决这个问题的两种方法:
不要将 Functions.h 包含到多个 .cpp 文件中 - 如果 h 文件包含许多 .cpp 文件所需的一些附加定义,则不能应用于复杂的项目。
将所有模板化函数声明为
static。但这意味着在包含 Functions.h 的所有 .cpp 文件中都会出现专门的函数,即使它们没有被使用,这可能会导致代码重复。
所以,我看到专门的模板化函数的行为类似于非模板化函数。在没有static 声明的情况下,是否有任何其他解决方案可以防止链接器错误?如果函数声明为 static,现代 C++ 编译器是否会从优化构建中删除它们(如果它们没有被使用)?
编辑。
阅读前两个答案后:我在这里不问如何防止此类链接器错误。假设我无法将专业化移动到 .cpp 文件并将其保留在带有 static 或 inline 的 .h 文件中,当将这些函数添加到每个 .h文件是否包含在内,即使它们没有被使用?
【问题讨论】:
-
显式特化的主体需要像普通的非模板函数(它们就是这样)一样放入 cpp 文件中。如果您愿意(这是有道理的),您可以交替使用
inline标记它们。
标签: c++ templates template-specialization