C ++ Packet Builder с шаблонами
-
29-09-2019 - |
Вопрос
PacketBuilder - это маленький класс, который позволяет записывать в массив Char *. Функции Append:
template <class T>
void PacketBuilder::Append(const T value)
{
memcpy((&m_Buffer) + m_Index, (const void*) &value, sizeof(T));
m_Index += sizeof(T);
}
Компиляция без ошибок. Если я позвоню приложению и использую T в качестве без знака (Word). Работает отлично. Если я использую T в качестве unsigned Char. Я получаю ошибку линкера.
m_Builder.Append<unsigned char>(0x01); // Error: LNK1120
m_Builder.Append<unsigned short>(0x0001); // Works
Ошибка от VS2010 (Sry I получила немецкий VS2010):
Ошибка lnk2019: verweis auf nicht aufgelöstes extrics auf "" Публичное: void __thiscall packetBuilder :: Добавить (unsigned Char) »(?? $ Append @ E @ PacketBuilder @@ Qaexe @ z)" В Funktion "" Public: void __thiscall Клиент: : Dohandhake (void) "(? Dohandshake @ Client @@ Qaexxz)". 1> C: XXX C ++ SilkRoademu Debug loginserver.exe: Fatal Error LNK1120: 1 Nicht Aufgelöste Externe Verweise.
Перевод на английский:
Ошибка lnk2019: неразрешенный внешний символ "" Публикация: void __thiscall packetbuilder :: Добавить (unsigned char) »(?? $ Append @ E @ PacketBuilder @@ Qaexe @ z)" В функции "" Публикация: 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);
}
};
Другие советы
Поместите определение метода в заголовок (файл HPP), а не в файле реализации (CPP).