Templates – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Templates – C / C++ – Fórum – Programujte.comTemplates – C / C++ – Fórum – Programujte.com

 

Honza0
Stálý člen
16. 3. 2007   #1
-
0
-

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. :)

Nahlásit jako SPAM
IP: ...–
NECIN DRUHYM TO, CO NECHCES, ABY ONI CINILI TOBE!
Jura
~ Anonymní uživatel
637 příspěvků
16. 3. 2007   #2
-
0
-

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;
}

Nahlásit jako SPAM
IP: ...–
sn3d0
Věrný člen
16. 3. 2007   #3
-
0
-

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..

Nahlásit jako SPAM
IP: ...–
shutdown -h now
sn3d0
Věrný člen
16. 3. 2007   #4
-
0
-

aaa uz ma chalan predbehol ;) no nic.. Idem ja radsej spat

Nahlásit jako SPAM
IP: ...–
shutdown -h now
Honza0
Stálý člen
16. 3. 2007   #5
-
0
-

Dekuju moc lidi... btw jo, musim mit tu tridu vnorenou ;).

Nahlásit jako SPAM
IP: ...–
NECIN DRUHYM TO, CO NECHCES, ABY ONI CINILI TOBE!
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žit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 97 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý