2010-11-07 4 views
0

PacketBuilder - это небольшой класс, который позволяет записывать в массив char *. Функции добавления:C++ Packet Builder с шаблонами

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 как символ без знака. Я получаю ошибку Linker.

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

Ошибка из VS2010 (SRY я получил немецкий VS2010):

ошибка LNK2019: Verweis Ауф Nicht aufgelöstes externes Символ "" общественность: пустота __thiscall PacketBuilder :: Append (неподписанные символ) " (? $ Append @ E @ PacketBuilder @@ QAEXE @ Z)" in Funktion "" public: void __thiscall Клиент :: DoHandshake (void) " (? DoHandshake @ Client @@ QAEXXZ)". 1> C: \ XXX \ C++ \ SilkroadEmu \ Debug \ LoginServer.exe : фатальная ошибка LNK1120: 1 nicht aufgelöste externe Verweise.

Перевод на английский:

ошибка LNK2019: неразрешенный внешний символ "" общественности: недействительным __thiscall PacketBuilder :: Append (неподписанные символ)» (?? $ Append @ E @ PacketBuilder @ @ QAEXE @ Z) " в функции" "public: void __thiscall Клиент :: DoHandshake (void)" (? DoHandshake @ Client @@ QAEXXZ) ". 1> C: \ XXX \ C++ \ SilkroadEmu \ Debug \ LoginServer.exe : фатальная ошибка LNK1120: 1 неразрешенный внешний символ.

+1

Можете вы добавить фактические сообщения об ошибках компоновщика на ваш вопрос? –

+0

'LNK1120' сообщает только количество нерешенных внешних. Вам нужно опубликовать сообщение об ошибке всего компоновщика, включая все сообщения 'LNK2001', которые появляются перед сообщением' LNK1120'. Просто сообщая нам, что код ошибки недостаточен, так как существует множество причин ошибки LNK2001. Если эти сообщения об ошибках относятся к коду, который не является частью вашего вопроса, вы должны добавить минимальный фрагмент кода. –

+0

Я могу только догадываться, в чем проблема с текущей информацией, но, возможно, это поможет: http://www.parashift.com/c++-faq-lite/templates.html#faq-35.12 и http: // www.parashift.com/c++-faq-lite/templates.html#faq-35.13. –

ответ

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

}; 
+0

большое спасибо. теперь он отлично работает – Aurus

5

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

+0

Уже сделано: шаблон void Append (значение const T); – Aurus

+3

@Aurus: определение включает в себя весь объект функции, как в коде между фигурными скобками ('{...}'). У вас есть только функция * Объявление *. Вам нужно включить полное описание функции в файл заголовка. –

Смежные вопросы