cpp文件的函数模板特化语法

Dav*_*evy 3 c++ templates

我有一个模板化的函数在我的.h中声明并在我的.cpp中实现:

//file.h
class FileReader{
template <class T> void Read( T *aValue );
};

//file.cpp
template<class T>
void
FileReader::Read( T *aValue )
{
    //implementation
}
Run Code Online (Sandbox Code Playgroud)

为了允许在我的.cpp中实现,我有

template void FileReader::Read<uint8_t>( uint8_t * );
template void FileReader::Read<uint16_t>( uint16_t * );
Run Code Online (Sandbox Code Playgroud)

但是试图修复一个doxygen问题,有人在这里指出我应该使用

template<> void FileReader::Read<uint8_t>( uint8_t * );
template<> void FileReader::Read<uint16_t>( uint16_t * );
Run Code Online (Sandbox Code Playgroud)

这确实解决了doxygen问题,但它在链接时打破了我的编译.

=>在我的.cpp中专门化我的函数模板并允许函数链接的正确语法是什么?

这个问题似乎表明我应该使用我的第二个版本.但是这个文章使用我的第一个版本.

Bri*_*ian 5

正确的语法取决于您实际尝试做什么.添加<>不仅仅是一种修复Doxygen的方法 - 它实质上改变了程序的含义!

以下是显式实例化定义:

template void FileReader::Read<uint8_t>( uint8_t * );
template void FileReader::Read<uint16_t>( uint16_t * );
Run Code Online (Sandbox Code Playgroud)

它们告诉编译器在那时和那里实例化函数模板,并为实例化发出符号,以便它们可以由另一个翻译单元链接.这似乎是你真正想要做的事情.

以下是显式特化声明:

template<> void FileReader::Read<uint8_t>( uint8_t * );
template<> void FileReader::Read<uint16_t>( uint16_t * );
Run Code Online (Sandbox Code Playgroud)

它们告诉编译器您将为这些特定模板参数定义自己的模板特化.因此,任何试图调用的人FileReader::Read<uint8_t>都不会实例化您已定义的主模板,而是寻找专门的定义.它看起来并不像你想要做的那样,但如果是这样的话,你实际上必须在某些时候定义这些特化.