插入功能模板专业化

Inlining a function template specialization

本文关键字:专业化 功能 插入      更新时间:2023-10-16

以下代码在.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包含.h)的A级代码不会编译

func<int, int>(1, 2);

启动链接器错误"错误lnk2005:" void __cdecl func(int const&amp;,int const&amp; amp; amp; amp; amp; amp;)(??>

为什么会发生这种情况?

编辑:

因此,由于它们是定义(由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)
{
...
}