内联函数模板专业化

以下代码位于.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

上一篇: Inlining a function template specialization

下一篇: C++ template in header file