[C++] Funkcja zwracająca obiekt klasy<typename T>

0

Witam,

mam klase oparta na szablonach:

Variable<T>

oraz klase Variables, ktora zawiera 5 map:

map<string, int> id;
map<int, int> type;
map<int, Variable<int> > intVariables;
map<int, Variable<bool> > boolVariables;
map<int, Variable<float> > floatVariables;

mapa <string, int> id przechowuje nazwe zmiennej i jej id,
mapa type<int, int> type przechowuje id obiektu Variable<T> i jego typ:

	const static int UNKNOWN = -1;
	const static int INT = 0;
	const static int BOOL = 1;
	const static int FLOAT = 2;

pozostale 3 mapy przechowuja id obiektu Variable<T>, ktore jest unikalne, oraz ta zmienna.

Chcialbym napisac metode klasy Variables, ktora zwroci mi obiekt klasy Variable<T> podajac id jako argument.

Ponizsza metoda nie dziala:

	template <typename T>
	Variable<T> get(string variables_name) {
		switch(type[id[variables_name]]) {
			case Variable<int>::INT: 
				return intVariables[id[variables_name]];
			case Variable<int>::BOOL: 
				return boolVariables[id[variables_name]];
			case Variable<int>::FLOAT: 
				return floatVariables[id[variables_name]];
			default: return 0;
		}
	}

Otrzymuje taki błąd:

error C2783: 'Variable<T> Variables::get(std::string)' : could not deduce template argument for 'T'

Dlatego chcialbym zapytac jak powinno sie (o ile to mozliwe) rozwiazac ten problem.

Pozdrawiam serdecznie

0

Ta metoda jest poza ciałem klasy szablonowej ?
Jeśli tak, to powinno być:

template <typename T>
Variable<T> Variables<T>::get(std::string) {
.
.
.
}
0

to nie jest bledem - jak tylko zmienie typ zwracajacy przez ta metode to dziala.

Problem polega na tym, ze kompilator nie jest w stanie "wydedukowac" jakie typu jest parametr T...

0

Identyczny kod działa bez problemu (uprościłem do minimum):

#include <iostream>

using namespace std;

template<typename T>
class szablon_bazowy {
	
public:
	
	T sz;
	
};

template<typename T>
class szablon {

public:
	
	szablon_bazowy<T> get();
	
	T dana;
	
};

template<typename T>
szablon_bazowy<T> szablon<T>::get() {
	
	szablon_bazowy<T> cos;
	
	return cos;
}

int main() {

	szablon<int> a;
	a.get();

}

Nie wiem jak wyglądają twoje klasy ...

0

No niestety nie dziala, moze dlatego, ze klasa Variables nie jest klasa szablonowa, zreszta wrzucam tutaj zrodelka obu plikow:

//...
class Variables {
public:	
//...	
	template <typename T>
	Variable<T> get(string variables_name) {
		switch(type[id[variables_name]]) {
			case Variable<int>::INT: 
				return intVariables[id[variables_name]];
			case Variable<int>::BOOL: 
				return boolVariables[id[variables_name]];
			case Variable<int>::FLOAT: 
				return floatVariables[id[variables_name]];
			default: return 0;
		}
	}

protected:
	map<string, int> id;
	map<int, int> type;
	map<int, Variable<int> > intVariables;
	map<int, Variable<bool> > boolVariables;
	map<int, Variable<float> > floatVariables;
	int numberOfVariables;
	int currentId;
};

Problem pojawia sie w przy wywolaniu metody get() klasy Variables:

#include <iostream>

#include "variable.h"
#include "variables.h"

int main() {
	Variable<int>* v;
	v = new Variable<int>(20, "var0");
	cout << "TYP: " << v->getType() << " NAZWA: " << v->getName() << " WARTOSC: " << v->getValue() << endl;
	Variables vs;
	vs.add(v);
	vs.add(new Variable<int>(12, "var1"));
	vs.add(new Variable<int>(124, "var2"));
	vs.add(new Variable<int>(121, "var3"));
	
	Variable<int> *v4;
	v4 =vs.get("var2");
	system("PAUSE");
//...
}

//Troche to pocialem, bo bylo za dlugie, a tak w ogole to wydaje mi sie, ze lepszy by byl polimorfizm niz szablony - foflik

0

Twój kod jest trochę długi, ale wiem już o co chodzi. Nigdy się nie spotkałem z takim czymś, ale pokombinowałem trochę i wyszło mi takie coś:

#include <iostream>

using namespace std;

template<typename T>
class szablon_bazowy {
       
public:
       
        T sz;
       
};

class szablon {

public:
		
	template<typename T>
        szablon_bazowy<T> get(T arg);
       
        int dana;
       
};

template<typename T>
szablon_bazowy<T> szablon::get(T arg) {
       
        szablon_bazowy<T> cos;
		
		cout << arg;
		
        return cos;
}

int main() {

        szablon a;
        a.get<double>(1.2);
	
	cin.get();
}

Swoją drogą, to gdybyś użył operoatora typeid(), to skróciłbyś sporo zapis ;)

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