PacketBuilder是一个小类,可以写入char *数组。附加功能:

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


编译没有错误。如果我打电话给Append并使用T作为无符号的短(WORD)。效果很好。如果我使用T作为无符号字符。我收到一个链接器错误。

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


来自VS2010的错误(很抱歉,我得到了德国vs2010):


  错误LNK2019:Verweis auf nicht
  aufgelöstesexternes符号“” public:
  无效__thiscall
  PacketBuilder :: Append(unsigned char)”
  (?? $ Append @ E @ PacketBuilder @@ QAEXE @ Z)“
  在Funktion“” public中:void __thiscall
  客户:: DoHandshake(void)“
  (?DoHandshake @ Client @@ QAEXXZ)”。
  1> C:\ XXX \ C ++ \ SilkroadEmu \ Debug \ LoginServer.exe
  :致命错误LNK1120:1 nicht
  外部Ververise。


翻译成英文:


  错误LNK2019:外部未解决
  符号“” public:无效__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
  :致命错误LNK1120:1未解决
  外部符号。

最佳答案

据我所知,您的PacketBuilder不是类模板。但是,PacketBuilder::Append是模板方法,它要求在其实例化的任何点都必须可见其定义。确保这一点的唯一真正安全的方法是将该方法模板的完整定义放入头文件中:

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);
 }

};

关于c++ - 带有模板的C++ Packet Builder,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4117430/

10-11 18:18