Specjalizacja funkcji w szablonie klasy

Specjalizacja funkcji w szablonie klasy
Kamil9132
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 173
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.

Kopiuj
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()
	{
	}
};
Kopiuj
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()
{
}
twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
0

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

Kamil9132
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 173
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

Kopiuj
#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()
{
}
Kopiuj
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

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
1

W nagłówku zostaw

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

a implementację wrzuć do jednego pliku cpp.

Kamil9132
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 173
0

Dziękuję za pomoc.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.