Ошибки связывания: <LNK1120> <LNK2020> Реализовать один класс данных сериализации в C ++ - PullRequest
1 голос
/ 29 февраля 2012

Я не знаю, почему у меня есть ошибка в проекте.Заголовок и код реализации для класса, на мой взгляд, реализованы правильно.Я буду признателен за сотрудничество, дорогие друзья.

Цель

Реализация одного класса данных сериализации в C ++

Erros Menssage

Ошибка 2 Ошибка LNK1120: 1 неразрешенный внешнийC: \ Users ... \ SerializationTest.exe 1 1 SerializationTest

Ошибка 1, ошибка LNK2020: неразрешенный токен (06000001) SerializationExtensions ^> :: Сериализация 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;
}

1 Ответ

3 голосов
/ 29 февраля 2012

Классы шаблонов должны иметь свое определение внутри заголовка, поэтому они видны всем TU, которые хотят специализировать класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...