我有一个类,其实现方式(略有)取决于所述乘数。基本上,它最终将是一个串行数据包。当置于ASCII模式时,许多位字段的宽度将加倍,并且这些字段的格式将不同。
不幸的是,由于我想使用std::bitset
,我无法动态声明宽度。我能提出的最合理的方法是使用模板代替。我想将模板定义与实现分开。因此,我做了以下事情:
My_Bytestream.hpp
#define NUMBITS(x) (x*sizeof(uint8_t))
enum My_BytestreamType
{
BINARY = 1,
ASCII = 2
};
template <My_BytestreamType MULTIPLIER>
class My_Bytestream
{
public:
My_Bytestream(My_Flag_t flags, My_Command_t command);
private:
boost::optional<std::bitset<NUMBITS(2 * MULTIPLIER) >> m_address;
boost::optional<std::bitset<NUMBITS(2 * MULTIPLIER) >> m_CRC;
};
MyBytestream.tpp
#include "stdafx.h"
#include "My_Bytestream.hpp"
template <My_BytestreamType MULTIPLIER> class My_Bytestream;
template<>
My_Bytestream<My_BytestreamType::BINARY>::My_Bytestream(My_Flag_t flags, My_Command_t command)
{
m_command = command;
}
但是,这会导致以下链接器错误:
error LNK2019: unresolved external symbol "public: __thiscall My_Bytestream<1>::My_Bytestream<1>(enum My_Flag_t,enum My_Command_t)" (??0?$My_Bytestream@$00@@QAE@W4My_Flag_t@@W4My_Command_t@@@Z) referenced in function "public: __thiscall My_Binary_Command::My_Binary_Command(enum My_Flag_t,enum My_Command_t)" (??0My_Binary_Command@@QAE@W4My_Flag_t@@W4My_Command_t@@@Z)
请注意,My_Flag_t
和My_Command_t
在另一个标头中定义为(不相关的)枚举。