Ahoj... proc mi nejde vytvorit funkce mimo sablonu, ktera bude vracet ukazatel na tridu definovanou v ty sablone?
template<typename Type> class vyssi_trida
{
public:
class trida
{
public:
Type value;
};
//constructor
vyssi_trida();
//methods
trida* funkce(Type);
protected:
trida *ukazatel;
};
template<typename Type> vyssi_trida<Type>::vyssi_trida()
{
ukazatel = new trida;
}
template<typename Type> trida* vyssi_trida<Type>::funkce(Type value)
{
return ukazatel;
}
a ted mi to pri kompilaci hodi spoustu bugu napr.:
missing ';' before '*'
missing type specifier - int assumed. Note: C++ does not support default-int
'Type' : undeclared identifier
a spoustu dalsich a pritom, kdyz mam funkci, ktera nema jako navratovou hodnotu trida*, ale jen trida, tak to funguje normalne a bez erroru.
a taky to funguje, kdyz dam tu funkci primo do te sablony:
template<typename Type> class vyssi_trida
{
public:
class trida
{
public:
Type value;
};
//constructor
vyssi_trida();
//methods
trida* funkce(Type);
protected:
trida *ukazatel;
public:
trida* funkce(Type value)
{
return ukazatel;
}
};
poradte nekdo prosim... dekuji moc. :)
Fórum › C / C++
Templates
Pokud nejaka sablona tridy pouziva vnorene tridy a zaroven chces definovat tela metod vne tridy musis pouzit klicove slovo typename(viz. nize) a je to jen kvuli toho, ze prekalda v prubehu programu nevi, jakeho tzpu ta vyssi trida je.
#include <cstdlib>
#include <iostream>
using namespace std;
template<typename Type> class vyssi_trida
{
public:
class trida
{
public:
Type value;
};
//constructor
vyssi_trida();
//methods
trida* funkce(Type);
protected:
trida *ukazatel;
};
template<typename Type> vyssi_trida<Type>::vyssi_trida()
{
ukazatel = new trida;
ukazatel->value = 155;
}
template<typename Type>
typename vyssi_trida<Type>::trida* vyssi_trida<Type>::funkce(Type value)
{
return ukazatel;
}
int main(int argc, char *argv[])
{
vyssi_trida<int> v;
cout << v.funkce(0)->value << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Problem je v tom ze trida je vnorena.. Totizto vtedy pri nie inline funkciach to nemoze byt trida* vyssi_trida::funkce() ale musi to byt vyssi_trida::trida* vyssi_trida::funkce(). To je ten kamen urazu. -otrebujes mat tu class trida vnorenu v sablone?Ja by som to riesil nejak:
template<class T>
class trida
{
public:
T value;
};
template<class T>
class vyssi_trida
{
public:
vyssi_trida();
trida<T>* funkce(T val);
protected:
trida<T>* ukazatel;
};
template<class T>
vyssi_trida<T>::vyssi_trida()
{
ukazatel = new trida<T>;
}
template<class T>
trida<T>* vyssi_trida<T>::funkce(T val)
{
return ukazatel;
}
To je vsak sila zvyku. Vnorene triedy mi pridu dost Javovske alebo .NETovske..
Zjistit počet nových příspěvků
Přidej příspěvek
Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
Uživatelé prohlížející si toto vlákno
Uživatelé on-line: 0 registrovaných, 97 hostů
Podobná vlákna
Free Cscart templates|Magento Templates|Wordpress templates|Joomla T… — založil caxidtemplates
Flash templates — založil PDyawisko
Templates - implementace funkcionality — založil Petr
[Python] generovat tabulku z listu s použitím Jinja templates — založil itlady
Moderátoři diskuze