C ++ Packet Builder с шаблонами - PullRequest
       13

C ++ Packet Builder с шаблонами

0 голосов
/ 07 ноября 2010

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 (sry, я получил немецкий vs2010):

error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "" public: void __thiscallPacketBuilder :: Append (unsigned char) "(?? $ Append @ E @ PacketBuilder @@ QAEXE @ Z)" в Функциях "" 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: Неразрешенный внешний символ "" 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 неразрешенный внешний символ.

Ответы [ 2 ]

5 голосов
/ 07 ноября 2010

Поместите определение метода в заголовок (файл hpp), а не в файл реализации (cpp).

1 голос
/ 07 ноября 2010

Ваш 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); 
 }

};
...