Šablony: syntax error : missing ';'

webhope

Šablony: syntax error : missing ';'
« kdy: 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?
« Poslední změna: 25. 11. 2013, 19:03:17 od Petr Krčmář »


llloyd

Re:šablony
« Odpověď #1 kdy: 25. 11. 2013, 18:49:55 »
prvne musis mit obecnou deklaraci, pak az muzes specializovat.

webhope

Re:Šablony: syntax error : missing ';'
« Odpověď #2 kdy: 25. 11. 2013, 19:28:49 »
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

Citace
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:
Kód: [Vybrat]
/*******************************************
   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".

Sten

Re:Šablony: syntax error : missing ';'
« Odpověď #3 kdy: 25. 11. 2013, 19:35:01 »
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

Citace
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:
Kód: [Vybrat]
/*******************************************
   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

webhope

Re:Šablony: syntax error : missing ';'
« Odpověď #4 kdy: 25. 11. 2013, 19:53:16 »
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


webhope

Re:Šablony: syntax error : missing ';'
« Odpověď #5 kdy: 25. 11. 2013, 20:03:07 »
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

webhope

Re:Šablony: syntax error : missing ';'
« Odpověď #6 kdy: 25. 11. 2013, 20:07:59 »
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


DK

Re:Šablony: syntax error : missing ';'
« Odpověď #7 kdy: 25. 11. 2013, 20:46:02 »
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?
Kód: [Vybrat]
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

Sten

Re:Šablony: syntax error : missing ';'
« Odpověď #8 kdy: 25. 11. 2013, 21:33:36 »
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.

webhope

Re:Šablony: syntax error : missing ';'
« Odpověď #9 kdy: 25. 11. 2013, 22:25:01 »
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

Re:Šablony: syntax error : missing ';'
« Odpověď #10 kdy: 25. 11. 2013, 22:44:52 »
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.

webhope

Re:Šablony: syntax error : missing ';'
« Odpověď #11 kdy: 26. 11. 2013, 11:27:34 »
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
Kód: [Vybrat]
InnerClass &getContent();a Vnější má deklaraci:

Kód: [Vybrat]
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?

llloyd

Re:Šablony: syntax error : missing ';'
« Odpověď #12 kdy: 26. 11. 2013, 11:55:47 »
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.

llloyd

Re:Šablony: syntax error : missing ';'
« Odpověď #13 kdy: 26. 11. 2013, 12:00:03 »
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;
}

webhope

Re:Šablony: syntax error : missing ';'
« Odpověď #14 kdy: 26. 11. 2013, 12:14:57 »
Aha, takže v kodu byla chyba. Má to být takto:
Kód: [Vybrat]
v = wrapper.getContent(); // call OuterClass.getContent()
o << v.getAtribut() << endl; // call OuterClass::InnerClass.getAtribut()
díky