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をunsignedcharとして使用する場合。リンカーエラーが発生します。

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

VS2010からのエラー(ドイツ語vs2010を取得しました):

エラーLNK2019:VerweisaufnichtaufgelöstesexternesSymbol"" 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:1nichtaufgelösteexterneVerweise。

英語に翻訳:

エラーLNK2019:未解決の外部シンボル "" public:void __thiscall PacketBuilder :: Append(unsigned char) "(?? $ Append @ E @ PacketBuilder @@ QAEXE @ Z)" in Function "" public:void __thiscall Client :: DoHandshake( void) "(?DoHandshake @ Client @@ QAEXXZ)"。1> C:\ XXX \ C ++ \ SilkroadEmu \ Debug \ LoginServer.exe:致命的なエラーLNK1120:1つの未解決の外部シンボル。

4

2 に答える 2

5

メソッド定義は、実装 (cpp) ファイルではなく、ヘッダー (hpp ファイル) に入れます。

于 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 に答える