0

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 用作 unsigned short (WORD)。它工作得很好。如果我使用 T 作为无符号字符。我收到链接器错误。

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

来自 VS2010 的错误(对不起,我得到了德语 vs2010):

错误 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)"。1>C:\XXX\C++\SilkroadEmu\Debug\LoginServer.exe : 致命错误 LNK1120: 1 nicht aufgelöste externe Verweise。

翻译成英文:

错误 LNK2019:函数“”公共:void __thiscall Client::DoHandshake(无效)“(?DoHandshake@Client@@QAEXXZ)”。1>C:\XXX\C++\SilkroadEmu\Debug\LoginServer.exe : 致命错误 LNK1120: 1 unsresolved external symbol。

4

2 回答 2

5

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

于 2010-11-07T11:31:07.313 回答
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); 
 }

};
于 2010-11-07T12:14:08.277 回答