[ Goran Arandjelovic @ 16.11.2007. 12:32 ] @
Da li je ovo u Standardu dozvoljeno:

Code:

struct NekiTip{};
struct NekiTip2{};

template<typename T>
struct A
{
  template<typename S>
  struct B { S x; };

  template<>
  struct B<NekiTip> { NekiTip2 x; };  // neka specijalizacija, nije bitno kakva...

  B<int> p;
};


Naime, VC++2005 ovo kompajlira bez problema dok gcc 3.4.2 ovo ne prolazi... Da li gcc jednostavno ne podrzava specijalizaciju nekog templejta unutar postojeceg ili je nesto drugo u pitanju?
[ NastyBoy @ 16.11.2007. 13:14 ] @
Uh, to je klizava zona :)

Koliko se secam (nemam vremena da preteram po dokumentaciji) gcc je u pravu i kazhe ti da ne mozhesh da specijalizujesh template na non-namespace nivou (shto je po standardu).
U prevodu, ne mozesh da izvrshish tu specijalizaciju u okviru same klase (ali mozhesh parcijalnu, shto tebi i nije korisno). Moracesh da tu specijalizaciju izbacish van klase.
[ kiklop74 @ 17.11.2007. 19:04 ] @
NastyBoy je u pravu.

Ono što možeš da uradiš je sledeće:

Code:

#include <iostream>

struct NekiTip {     };
struct NekiTip2{     };

template<typename T>
struct A
{
  template<typename S, int dummy>
  struct B { B() : x(S()) {} S x; };

  template < int N >
  struct B<NekiTip, N> { NekiTip2 x; };  // neka specijalizacija, nije bitno kakva...

  B<int,3> p;
};


int main(void) {
  A<int> a;
  std::cout << a.p.x << std::endl;
  return 0;
}


Puna specijalizacija templejta unutar klase neće raditi na većini kompajlera a i standard to ne dopušta. Ono što je moguće je parcijalna specijalizacija iz dva prolaza. Dodaš jedan celobrojni parametar čisto da bi parcijalna specijalizacija bila moguća i eto rešenja.

Inače nikad ne treba uzimati samo jedan kompajler kao referencu. Kod je poželjno isprobati na više njih. Tvoj originalni kod mogu da prevedu samo intelov i microsoftov kompajler (verzija 8).
[ 1jedini @ 18.11.2007. 12:07 ] @
Da potvrdim predhodno navedeno.

Za eskplicitne specijalizacije stvar je cista:

Citat:

14.7.3.1
2 — An explicit specialization shall be declared in the namespace of which the template is a member, or, for
member templates, in the namespace of which the enclosing class or enclosing class template is a member.
An explicit specialization of a member function, member class or static data member of a class template
shall be declared in the namespace of which the class template is a member. ...


Ako mora ( shall be ) u namespace-u onda ne moze van jer bi bilo multiple declaration.



Za delimicne je malko mutno:

Citat:

14.5.4
6 — A class template partial specialization may be declared or redeclared in any namespace scope in which its
definition may be defined (14.5.1 and 14.5.2). ...


Da su mesto may be stavili shall be, pa da bude potpuno odredjeno.
Ovako ne zvuci da samo tu mora.

I Working Draft (Doc No: N2461=07-0331, Date: 2007-10-22 ) kaze isto.



[ Goran Arandjelovic @ 23.11.2007. 09:18 ] @
Hvala na odgovorima.. ono što ostaje je da se čovek pita šta da radi kada je u pitanju template metaprogramiranje, jer se u samom startu mora voditi računa koji kompajler koliko poštuje Standard kako bi kod bio uvek (ili u što većem broju slučajeva) portabilan.
[ kiklop74 @ 23.11.2007. 20:19 ] @
Citat:
Goran Arandjelovic: Hvala na odgovorima.. ono što ostaje je da se čovek pita šta da radi kada je u pitanju template metaprogramiranje, jer se u samom startu mora voditi računa koji kompajler koliko poštuje Standard kako bi kod bio uvek (ili u što većem broju slučajeva) portabilan.


Za te slucajeve postovanja/nepostovanja standarda postoji #ifdef direktiva
[ tosa @ 24.11.2007. 14:38 ] @
Citat:
kiklop74: Za te slucajeve postovanja/nepostovanja standarda postoji #ifdef direktiva

To je prilično loša praksa koja ostavlja solidnu količinu "prljavog" koda.
Najbolje je naći portabilno rešenje ili napisati kod tako da nema problema sa standardima.
Ako se nagomilaju #ifdef-ovi, održavanje postaje dosta nezgodno.
[ kiklop74 @ 25.11.2007. 04:59 ] @
Citat:
tosa: To je prilično loša praksa koja ostavlja solidnu količinu "prljavog" koda.
Najbolje je naći portabilno rešenje ili napisati kod tako da nema problema sa standardima.
Ako se nagomilaju #ifdef-ovi, održavanje postaje dosta nezgodno.

Tako je. I tako se radi kada je to moguce. Na zalost, uvek ima i onih drugih situacija.