我在cppreference (“模板朋友运算符”部分)看到了以下示例,简化了 template<typename> struct Foo; template<typename T> void bar(Foo<T>) {} template<typenam ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我有一个模板化的函数在我的.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问题,有人在这里指出我应该使用
template<> void FileReader::Read<uint8_t>( uint8_t * );
template<> void FileReader::Read<uint16_t>( uint16_t * );
这确实解决了doxygen问题,但它在链接时打破了我的编译。
=>在我的.cpp中专门化我的函数模板并允许函数链接的正确语法是什么?
正确的语法取决于您实际尝试做什么。 添加<>
不仅仅是一种修复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>
都不会实例化您已定义的主模板,而是寻找专门的定义。 它看起来并不像你想要做的那样,但如果是这样的话,你实际上必须在某些时候定义这些特化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.