枚举类型的显式模板专业化

时间:2016-07-06 22:57:04

标签: c++ templates template-specialization

我有一个类,其实现方式(略有)取决于所述乘数。基本上,它最终将是一个串行数据包。当置于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_tMy_Command_t在另一个标头中定义为(不相关的)枚举。

0 个答案:

没有答案