简体   繁体   English

带有模板的C ++ Packet Builder

[英]C++ Packet Builder with Templates

PacketBuilder is a little Class which allow to write into a char* array. PacketBuilder是一个小类,可以写入char *数组。 The Append Functions: 附加功能:

template <class T>
void PacketBuilder::Append(const T value)
{
 memcpy((&m_Buffer) + m_Index, (const void*) &value, sizeof(T));
 m_Index += sizeof(T);
}

Compiling without errors. 编译没有错误。 If I call Append and use T as unsigned short (WORD). 如果我打电话给Append并使用T作为无符号的短(WORD)。 It works great. 效果很好。 If I use T as unsigned char. 如果我使用T作为无符号字符。 I get an Linker Error. 我收到链接器错误。

m_Builder.Append<unsigned char>(0x01); // Error: LNK1120
m_Builder.Append<unsigned short>(0x0001); // Works

Error from VS2010 (sry i got german vs2010): 来自VS2010的错误(很抱歉,我得到了德国vs2010):

error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: void __thiscall PacketBuilder::Append(unsigned char)" (??$Append@E@PacketBuilder@@QAEXE@Z)" in Funktion ""public: void __thiscall Client::DoHandshake(void)" (?DoHandshake@Client@@QAEXXZ)". 错误LNK2019:在Funktion中显示符号“” public:void __thiscall PacketBuilder :: Append(unsigned char)“(?? $ Append @ E @ PacketBuilder @@ QAEXE @ Z)”“ public:void __thiscall客户: :DoHandshake(void)“(?DoHandshake @ Client @@ QAEXXZ)”。 1>C:\\XXX\\C++\\SilkroadEmu\\Debug\\LoginServer.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise. 1> C:\\ XXX \\ C ++ \\ SilkroadEmu \\ Debug \\ LoginServer.exe:致命错误LNK1120:1无法正常使用Verweise。

Translated to English: 翻译成英文:

error LNK2019: Unresolved external symbol ""public: void __thiscall PacketBuilder::Append(unsigned char)" (??$Append@E@PacketBuilder@@QAEXE@Z)" in Function ""public: void __thiscall Client::DoHandshake(void)" (?DoHandshake@Client@@QAEXXZ)". 错误LNK2019:无法解析的外部符号“” public:void __thiscall PacketBuilder :: Append(unsigned char)“(?? $ Append @ E @ PacketBuilder @@ QAEXE @ Z)”在函数“” public:void __thiscall Client :: DoHandshake(无效)”(?DoHandshake @ Client @@ QAEXXZ)”。 1>C:\\XXX\\C++\\SilkroadEmu\\Debug\\LoginServer.exe : fatal error LNK1120: 1 unsresolved external symbol. 1> C:\\ XXX \\ C ++ \\ SilkroadEmu \\ Debug \\ LoginServer.exe:致命错误LNK1120:1个无法解析的外部符号。

将方法定义放在标头(hpp文件)中,而不在实现(cpp)文件中。

Your PacketBuilder is not a class template, as far as I can see. 据我PacketBuilder您的PacketBuilder不是类模板。 PacketBuilder::Append is however a template method, which requires that it's definition must be visible at any point of instantiation of this method. 但是, PacketBuilder::Append是模板方法,它要求在该方法的任何实例化点都必须可见其定义。 The only really safe way to assure this is to put the complete definition of this method template into the header file: 确保这一点的唯一真正安全的方法是将该方法模板的完整定义放入头文件中:

class PacketBuilder {
 // declarations of non-template members

public:
 template <class T> 
 void Append(const T value) 
 { 
  memcpy((&m_Buffer) + m_Index, (const void*) &value, sizeof(T)); 
  m_Index += sizeof(T); 
 }

};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM