2010-11-07 62 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作为无符号字符。我收到一个链接错误。从VS2010

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

错误(SRY我得到德国VS2010):

错误LNK2019:Verweis奥夫nicht aufgelöstesexternes符号 “” 市民: 无效__thiscall PacketBuilder ::追加(无符号字符) “? (?? $ 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östeexterne Verweise。

翻译成英文:

错误LNK2019:无法解析的外部 符号 “” 市民:无效__thiscall PacketBuilder ::追加(无符号字符)” (?? $追加| 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未解决 外部符号。

+1

您能否将实际的链接器错误消息添加到您的问题中? – 2010-11-07 11:09:51

+0

'LNK1120'只会告诉你未解析的外部数量。您需要发布完整的链接器错误消息,包括LNK1120消息之前的所有LNK2001消息。只是告诉我们错误代码是不够的,因为导致“LNK2001”错误的原因很多。如果这些错误消息引用的代码不属于您的问题,那么您应该添加这些代码的最小代码段。 – 2010-11-07 11:16:42

+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。 – 2010-11-07 11:23:31

回答

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 2010-11-07 13:28:55

5

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

+0

已经做到这一点:template void Append(const T value); – Aurus 2010-11-07 11:35:31

+3

@Aurus:定义包括整个函数体,如大括号('{...}')之间的代码。你有什么只是功能*声明*。您需要在头文件中包含整个函数定义。 – 2010-11-07 11:46:13