Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: webhope 25. 11. 2013, 17:52:04
-
Opět řeším článek z roku 2001 o šablonách. A tentokrát mám dva kódy, týkající se specializací, které nemohu rozjet a v obou případech dostávám chybovou hlášku error C2143: syntax error : missing ';' before '<'.
Zatím jen uvedu ten první kód, který má zakomentovanou vnitřní část šablony a část implementace. Zakomentoval jsem to proto, aby bylo lépe vidět, co způsobuje tu chybu.
http://paste.ofcode.org/36M6U4vXU3txYL4rUxkgFSW
Možná se mi pak povede vyřešit i ten druhý kód. Něco tomu kódu chybí nebo se změnila syntaxe?
-
prvne musis mit obecnou deklaraci, pak az muzes specializovat.
-
Je to podle tohoto článku:
http://www.builder.cz/rubriky/c/c--/sablony-datovych-typu-v-c--155883cz
a nemohu se v tom
vyznat. Zkoušel jsem
http://paste.ofcode.org/dMxEs9SWc4zBvEe5CEPwmB
Autor píše:
Částečná specializace
Pokusíme se pro ukázku částečně specializovat naší šablonu Obal. ... Nejprve je nutné uvést obecnou šablonu, která je napsána výše. Poté se uvede částečná specializace šablony:
Výše je uvedený kód (ten úplně na začátku článku) kde jsou šablony metod getVar a setVar (přejmenovávám metody do angličtiny).
Pak tam je implementace:
/*******************************************
IMPLEMENTATION - you see the operator ::
*******************************************/
template<class Typ> Obal<Typ>::Obal() : MyVar(){}
template<class Typ> Obal<Typ>::Obal(Typ p) : MyVar(p){}
template<class Typ> Obal<Typ>::Obal(Obal &second) : MyVar(second.getVar()){}
template<class Typ> Typ Obal<Typ>::getVar()
{ return MyVar; }
template<class Typ> void Obal<Typ>::setVar(Typ p)
{ MyVar = p; }
A tam taky jsou getVar a setVar.
Ale u té specializované šablony je *getVar a setVar čili zdá se že to nejde dohromady. Tu implementaci jsem tam nezkoušel dát, jen to co uvádím v odkaze v tomto příspěvku. To hlásí chybu nevyřešených referencí.
Pak jsem tam zkoušel dát ten zakomentovaný kód s metodami *getVar() a setVar() a ten píše tu samou chybu jako před tím
error C2143: syntax error : missing ';' before '<'
Celé mi to připadá, že tam příjde spíš to co mám zakomentováno ale pak to v tom článku je špatně a místo "níže" mají "výše".
-
Je to podle tohoto článku:
http://www.builder.cz/rubriky/c/c--/sablony-datovych-typu-v-c--155883cz
a nemohu se v tom
vyznat. Zkoušel jsem
http://paste.ofcode.org/dMxEs9SWc4zBvEe5CEPwmB
Autor píše:
Částečná specializace
Pokusíme se pro ukázku částečně specializovat naší šablonu Obal. ... Nejprve je nutné uvést obecnou šablonu, která je napsána výše. Poté se uvede částečná specializace šablony:
Výše je uvedený kód (ten úplně na začátku článku) kde jsou šablony metod getVar a setVar (přejmenovávám metody do angličtiny).
Pak tam je implementace:
/*******************************************
IMPLEMENTATION - you see the operator ::
*******************************************/
template<class Typ> Obal<Typ>::Obal() : MyVar(){}
template<class Typ> Obal<Typ>::Obal(Typ p) : MyVar(p){}
template<class Typ> Obal<Typ>::Obal(Obal &second) : MyVar(second.getVar()){}
template<class Typ> Typ Obal<Typ>::getVar()
{ return MyVar; }
template<class Typ> void Obal<Typ>::setVar(Typ p)
{ MyVar = p; }
A tam taky jsou getVar a setVar.
Ale u té specializované šablony je *getVar a setVar čili zdá se že to nejde dohromady. Tu implementaci jsem tam nezkoušel dát, jen to co uvádím v odkaze v tomto příspěvku. To hlásí chybu nevyřešených referencí.
Pak jsem tam zkoušel dát ten zakomentovaný kód s metodami *getVar() a setVar() a ten píše tu samou chybu jako před tím
error C2143: syntax error : missing ';' before '<'
Celé mi to připadá, že tam příjde spíš to co mám zakomentováno ale pak to v tom článku je špatně a místo "níže" mají "výše".
Hvězdička se nevztahuje ke jménu metody, ale k typu návratové hodnoty. Není to metoda *getVar, která vrací proměnnou typu Type, ale metoda getVar, která vrací proměnnou typu Type *
V tom článku je to napsáno správně: Nejprve je nutné uvést obecnou šablonu, která je napsána výše
-
to je ten kod co tam mam template<class Typ> class Obal {...}
vrací chybu
02 templates - částečná specializace (2).obj : error LNK2019: unresolved external symbol "public: int * __thiscall Obal<int *>::getVar(void)" (?getVar@?$Obal@PAH@@QAEPAHXZ) referenced in function _main
02 templates - částečná specializace (2).obj : error LNK2019: unresolved external symbol "public: __thiscall Obal<int *>::Obal<int *>(int *)" (??0?$Obal@PAH@@QAE@PAH@Z) referenced in function _main
02 templates - částečná specializace (2).obj : error LNK2019: unresolved external symbol "public: void __thiscall Obal<int>::setVar(int)" (?setVar@?$Obal@H@@QAEXH@Z) referenced in function _main
02 templates - částečná specializace (2).obj : error LNK2019: unresolved external symbol "public: int __thiscall Obal<int>::getVar(void)" (?getVar@?$Obal@H@@QAEHXZ) referenced in function _main
02 templates - částečná specializace (2).obj : error LNK2019: unresolved external symbol "public: __thiscall Obal<int>::Obal<int>(int)" (??0?$Obal@H@@QAE@H@Z) referenced in function _main
-
Třeba toto mi hází unresolved externals:
http://paste.ofcode.org/dDsMQqpZkRpFXdpzxQcT7W
a to je ČÁSTEČNÁ specializace "public: __thiscall Obal<int>::Obal<int>(int)" (??0?$Obal@H@@QAE@H@Z) referenced in
-
a toto je ÚPLNÁ specializace:
http://paste.ofcode.org/Rjh9x6RyJdrxsGFcrTGLxZ
LNK2019: unresolved external symbol "public: __thiscall Obal<int>::Obal<int>(int)" (??0?$Obal@H@@QAE@H@Z) referenced in function _main
-
tak se z toho naucte cist, nebo jeste lepe, prectete si neco o sablonach
ale nejdrive to rozebereme
1) vyhodte stdafx
2) pouzivat win-specific funkce je cesta do pekel (na to si pouzivejte dotnet a c#), tudiz getchar misto _getch, strdup misto _strdup atd.
3) co myslite, ze provede nasledujici kod?
int vytiskni(int cislo);
int main(){
vytiskni(5);
return 0;
}
4) az si budete jisty, proc nefunguje kod z bodu 3., mrknete na popis obecne sablony, snad vam to bude jasne
5) pouzivani tutorialu z roku 2001 asi nebude to prave orechove, kdyz tam ani neuci, jak cist chybove hlasky, mozna bych spise doporucil se naucit aspon vyborne zaklady C, pak pokracovat na C++, pokud se tomu chcete venovat poradne
-
Problém je v tom, že ty funkce z té částečné specializace mají deklaraci (kompilátor ví, že existují), ale nemají definici (kompilátor resp. linker neví, co mají dělat).
Pro začátečníka bych navíc doporučil nějaký kompilátor, který vypisuje informace srozumitelně, tedy rozhodně ne MS Visual C++. Nejvhodnější je LLVM Clang, hned za ním GCC od verze 4.8.0.
-
Sten:
Zmátlo mě že llloyd napsal, že potřebuji jen deklaraci. Nepsal, že potřebuju deklaraci i implementaci. Dík
Na to jsem se tu na foru už ptal a nebylo mi odpovězeno na otázku, z kterého zdroje ten Clang stáhnout (nevím který zdroj je bezpečný).
-
Sten:
Zmátlo mě že llloyd napsal, že potřebuji jen deklaraci. Nepsal, že potřebuju deklaraci i implementaci. Dík
Na to jsem se tu na foru už ptal a nebylo mi odpovězeno na otázku, z kterého zdroje ten Clang stáhnout (nevím který zdroj je bezpečný).
Pro kompilátor (*.cpp a všechna jím includovaná *.hpp) stačí deklarace. Pro linker (spojující *.o nebo jak se to ve Windows označuje a *.dll) je ale potřeba zkompilovaná definice.
Clang Windows oficiálně podporuje jen experimentálně (podpora některých specialit Win32 API je jen částečná, ale pro učení se C++ to není potřeba), a proto zatím nemá žádný oficiální build pro Windows, ale jde buď zkompilovat podle postupu na Clang.LLVM.org nebo stáhnout už zkompilovaný odsud (http://www.ishani.org/web/articles/code/clang-win32/).
-
Mám dotaz na tenhle kód vnořené šablony:
http://paste.ofcode.org/QhmQ4CzBhgg9T76wuBeuxM
dostávám chybu error C2039: 'getContent' : is not a member of 'OuterClass::InnerClass'
a když se na to dívám, nejsem si jist jestli je to v tom kodu spravně deklarované:
Vnitřní třída má deklaraci
InnerClass &getContent();a Vnější má deklaraci:
OuterClass::InnerClass &OuterClass::getContent()
{ return Content; }
Proč si překladač myslí, že funkce getContent má být umístěna pod OuterClass::InnerClass ? Ta deklarace OuterClass::InnerClass &OuterClass::getContent() snad říká jaký typ má vracet metoda getContent, ne?
-
Mám dotaz na tenhle kód vnořené šablony:
http://paste.ofcode.org/QhmQ4CzBhgg9T76wuBeuxM
dostávám chybu error C2039: 'getContent' : is not a member of 'OuterClass::InnerClass'
a když se na to dívám, nejsem si jist jestli je to v tom kodu spravně deklarované:
Protoze volas getcontent dvakrat:
v = wrapper.getContent();
o << v.getContent() << endl;
ten prvni ti vrati inner class a ten druhy je volan na inner class.
-
Zmátlo mě že llloyd napsal, že potřebuji jen deklaraci. Nepsal, že potřebuju deklaraci i implementaci. Dík
Deklarace staci pokud tu ne-specializovanou tridu nikdy nepouzijes. Napr:
// obecna deklarace
template<typename T>
class My_class;
// specializace pro konkretni typ
template<>
class My_class<int> { };
int main() {
// spravne
My_class<int> a;
// chyba
My_class<float> b;
}
-
Aha, takže v kodu byla chyba. Má to být takto:
v = wrapper.getContent(); // call OuterClass.getContent()
o << v.getAtribut() << endl; // call OuterClass::InnerClass.getAtribut()
díky