Specjalizacja funkcji w szablonie klasy

0

Witam.
W jaki sposób prawidłowo napisać specjalizacje funkcji w szablonie klasy?

Próbowałem rozwiązać problem przy użyciu dwóch metod, jednak żadna nie daje prawidłowego rezultatu.

template<class T> class ConfigFile
{
	std::string fileName;

	std::vector<std::pair<std::string, T>> values;

public:

	void ConfigFile<T>::Save()
	{
	}
	void ConfigFile<std::vector<int>>::Save()
	{
	}
};
template<class T> class ConfigFile
{
	std::string fileName;

	std::vector<std::pair<std::string, T>> values;

public:

	void Save();
};

template<class T> void ConfigFile<T>::Save()
{
}

template<> void ConfigFile<std::vector<int>>::Save()
{
}
0

Co to znaczy nie daje prawidłowego rezultatu? Na oko drugie rozwiązanie jest ok: http://ideone.com/oY27By

0

@spartanPAGE
Klasa zawiera kilka metod, z których tylko dwie Load oraz Save będą się różnić w zależności od typu.
Jeśli przy specjalizacji klasy wystarczy zmienić te dwie metody, a pozostałe zostaną użyte z wersji dla class T, to jest to czego szukam, jednak jeśli będę musiał skopiować pozostałe metody, które są niezależne od typu to nie będzie to odpowiednie rozwiązanie.

Odnośnie drugiej wersji dla std::vector<int>, nie miałem pomysłu jak zrobić to dla vectora dowolnego typu, więc wybrałem int, którego obecnie potrzebowałem, a w przyszłości rozszerzyłbym to o inne typy.

@twonek

#pragma once
#include "Globals.h"

template<class T> class ConfigFile
{
	std::string fileName;

	std::vector<std::pair<std::string, T>> values;



	void Load()
	{
	}

public:



	void ConfigFile<T>::Initialize(const std::string& name, const std::string& headName)
	{
	}

	void Save();

	void ConfigFile<T>::SetValue(const std::string& valueName, T value, int addValue = 0, bool search = true)
	{
	}

	T ConfigFile<T>::GetValue(const std::string& valueName)
	{
		return 0;
	}

};

template<class T> void ConfigFile<T>::Save()
{
}

template<> void ConfigFile<std::vector<int>>::Save()
{
}
Error	LNK1169	one or more multiply defined symbols found
Error	LNK2005	"public: void __thiscall ConfigFile<class std::vector<int,class std::allocator<int> > >::Save(void)" (?Save@?$ConfigFile@V?$vector@HV?$allocator@H@std@@@std@@@@QAEXXZ) already defined in Head_Logic.obj

Visual Studio 2015 Community

1

W nagłówku zostaw

template<> void ConfigFile<std::vector<int>>::Save();

a implementację wrzuć do jednego pliku cpp.

0

Dziękuję za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1