cpp文件的功能模板专门化语法

时间:2018-11-14 18:45:26

标签: 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
}

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

template void FileReader::Read<uint8_t>( uint8_t * );
template void FileReader::Read<uint16_t>( uint16_t * );

但是尝试解决Doxygen问题时,有人指出here我应该使用

template<> void FileReader::Read<uint8_t>( uint8_t * );
template<> void FileReader::Read<uint16_t>( uint16_t * );

这确实可以解决doxygen问题,但在链接时破坏了我的编译。

=>什么是在我的.cpp中专用于我的功能模板并允许链接功能的正确语法?

This其他问题似乎表明我应该使用第二个版本。但是this的文章使用的是我的第一个版本。

1 个答案:

答案 0 :(得分:5)

正确的语法取决于您实际要执行的操作。添加<>不仅是修复Doxygen的一种方法-它实质上改变了程序的含义!

以下是显式实例化定义

template void FileReader::Read<uint8_t>( uint8_t * );
template void FileReader::Read<uint16_t>( uint16_t * );

它们告诉编译器立即并在那里实例化功能模板,并发出用于实例化的符号,以便它们可以被另一个翻译单元链接。这似乎是您实际上想要做的。

以下是明确的专业声明

template<> void FileReader::Read<uint8_t>( uint8_t * );
template<> void FileReader::Read<uint16_t>( uint16_t * );

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

相关问题