最近笔者在Linux环境下学习C++,用g++编译时遇到一个错误。笔者在crc.hpp
文件中给出了类的声明,并在crc.cpp
文件中给出了类的实现
1 | /* crc.hpp */ |
1 | /* crc.cpp */ |
然后笔者在main.hpp
中引用crc.hpp
,并在main.cpp
中实例化了一个对象
1 | CRC<uint16_t> CRC16(0x8005, 0x0000, 0x0000, true, true); |
测试时用到
1 | void Thread_1000ms(void){ |
编译上述代码时一直报错:
1 | /usr/bin/ld: /tmp/cc1W785D.o: in function `Thread_1000ms()': |
查找了一下解决方案,都说声明/实现无法分离,这种回答令人感到不可思议,怎么可能无法分离?经过数日的查找,终于找到解决方案:模板类声明/定义分离时,需要在*.cpp
文件中对模板类进行特化处理。具体的说,就是在上述*.cpp
文件开头加入一句
1 | template class CRC<uint16_t>; |
终于编译成功。并且经过测试笔者发现,这样还有一个额外的技术效果:如果在*.cpp
文件中对模板类进行特化时只写
1 | template class CRC<uint8_t>; |
则在其他地方实例化时只能实例化uint8_t
,uint16_t
,uint32_t
三种类型的对象,如果尝试实例化CRC<double> CRC16(0x8005, 0x0000, 0x0000, true, true);
,编译器会报undefined reference to
错误,这样便限制了模板类的输入类型。
参考文献
[1] 小强的机器人工坊. C++模板类的申明和定义分离的实现方法[DB/OL]. https://blog.csdn.net/l1216766050/article/details/112107682, 2021-01-02/2021-08-28
[2] huanghxyz. C++泛型模板函数编程中“undefined reference to”错误[DB/OL]. https://blog.csdn.net/huanghxyz/article/details/85280144, 2018-12-27/2021-08-28