【问题标题】:Linking errors: <LNK1120> <LNK2020> Implement one serialization data class in C++链接错误:<LNK1120> <LNK2020> 在 C++ 中实现一个序列化数据类
【发布时间】:2012-02-29 13:43:05
【问题描述】:

我不知道为什么我在项目中有链接错误。我认为该类的标头和实现代码已正确实现。亲爱的朋友们,我将感谢您的合作。

目标

用C++实现一个序列化数据类

错误消息

Error 2 error LNK1120: 1 unresolved externals C:\Users...\SerializationTest.exe 1 1 SerializationTest

错误 1 ​​错误 LNK2020:未解析的令牌 (06000001) SerializationExtensions ^>::Serialize C:\Users...\SerializationTest.obj SerializationTest

这里是代码

文件:SerializationExtensions.h

#ifndef __SERIALIZATION_EXTENSIONS_H__
#define __SERIALIZATION_EXTENSIONS_H__


template<class T>
public ref class SerializationExtensions
{
public:
    static System::String^ Serialize(T obj);
    static T Deserialize(System::String^ serialized);
};


#endif // __SERIALIZATION_EXTENSIONS_H__

文件:SerializationExtensions.cpp

#include "stdafx.h"
#include "SerializationExtensions.h"

#using <System.Runtime.Serialization.dll>

using namespace System::IO;
using namespace System::Xml;
using namespace System::Runtime::Serialization;

template<class T>
System::String^ SerializationExtensions<T>::Serialize(T obj)
{
    DataContractSerializer^ serializer = gcnew DataContractSerializer(obj->GetType());
    StringWriter^ writer = gcnew StringWriter();
    XmlTextWriter^ stm = gcnew XmlTextWriter(writer);
    serializer->WriteObject(stm, obj);
    return writer->ToString();
}

template<class T>
T SerializationExtensions<T>::Deserialize(System::String^ serialized)
{
    DataContractSerializer^ serializer = gcnew DataContractSerializer(typeof(T));
    StringReader^ reader = gcnew StringReader(serialized);
    XmlTextReader^ stm = gcnew XmlTextReader(reader);
    return (T)serializer->ReadObject(stm);
}

文件:SerializationTest.cpp

// SerializationTest.cpp : main project file.

#include "stdafx.h"
#include "SerializationExtensions.h"


using namespace System::Collections::Generic;
using namespace System;


int main(array<System::String ^> ^args)
{

    Dictionary<System::String^, System::Double>^ teste = gcnew Dictionary<System::String^, System::Double>();
    teste->Add("Teste1",2);
    teste->Add("Teste2",4);

    Console::WriteLine(SerializationExtensions<Dictionary<System::String^, System::Double>^>::Serialize(teste));

    return 0;
}

【问题讨论】:

    标签: c++ .net visual-studio-2010


    【解决方案1】:

    模板类的定义需要在标头中,因此所有想要专门化该类的 TU 都可以看到它。

    将实现移至SerializationExtensions.h。

    【讨论】:

    • 你说得对,它有效!现在我明白了,模板不能在 .cpp 和 .h 文件中分开。谢谢卢奇安
    • @RafaelCosta 是的。 SO上有很多这样的问题,这就是我没有扩大答案的原因。缺点是它们不容易找到,如果你不知道要寻找什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多