内联函数模板专业化
以下代码位于.h文件中(包含防护)
template<typename T1, typename T2> // a
void func(T1 const &t1, T2 const &t2)
{
std::cout << "nbase template";
}
template<> // b
inline void func<int, int>(int const &t1, int const &t2)
{
std::cout << "nspecialization for integers";
}
从(b)中删除内联关键字时,下面的代码(包含.h的.cpp调用)将不会编译
func<int, int>(1, 2);
发现链接器错误“错误LNK2005:已在ConsoleApplication1.obj中定义的”void __cdecl func(int const&,int const&)“(?? $ func @ HH @@ YAXABH0 @ Z)
这是为什么发生?
编辑:
因此,既然它们是定义(由Luchian Grigore回答),明确的专门化意味着明确的实例化还是该编译器特定的?
因为明确的特化是定义,因此将该文件包含在多个翻译单元中会导致多次定义该符号,这违反了一个定义规则。
除了将其标记为inline
,您还可以将声明留在标题中,并将定义移至实现文件。
您只能使用类型本身直接覆盖它,而无需编写模板:
void func(int const &t1, int const &t2)
{
std::cout << "nspecialization for integers";
}
现在,错误发生是因为如果在头文件中定义该函数,那么如果包含头文件,该函数可能会以两个cpp文件结尾,所以会有两个相同函数的声明(如错误说: already defined
),从而导致链接错误。 为了解决这个问题,只需在头文件中写入声明而不需要实现,并将实现移动到其中一个头文件中:
//header
void func(int const &t1, int const &t2);
//cpp file
void func(int const &t1, int const &t2)
{
...
}
链接地址: http://www.djcxy.com/p/37137.html