我在.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中专用于我的功能模板并允许链接功能的正确语法?
答案 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>
的人都不会实例化您已经定义的主模板,而是寻找专门的定义。看起来这不是您要尝试的方法,但是如果是这样,您实际上必须在某个时候定义这些专业化。