我有一个模板化的函数在我的.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中专门化我的函数模板并允许函数链接的正确语法是什么?
正确的语法取决于您实际尝试做什么.添加<>不仅仅是一种修复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>都不会实例化您已定义的主模板,而是寻找专门的定义.它看起来并不像你想要做的那样,但如果是这样的话,你实际上必须在某些时候定义这些特化.
| 归档时间: |
|
| 查看次数: |
132 次 |
| 最近记录: |