Sziasztok!
A következő kódrészlet gcc alatt nem fordul, míg Visual Studioban igen. Más fordítók alatt is probláma nélkül megy.
Nagyon fontos a portolás szempontjából, hogy a
XTCPoolSingleton< sizeof( Tx_ ) >::Alloc< Tx_ >( (int)size );
sor működjék.
Nem megoldás, ha az Alloc void*-ot ad vissza, és utólag cast-olok, ekkora módosítást nem akarok a kódban.
Megoldási javaslatok?
template< int SizeOfType >
class XTCPoolSingleton {
public:
template< typename T_ >
static T_ * Alloc( int size )
{
return new T_;
}
static int * IntAlloc( int size )
{
return new int;
}
};
template < class Tx_, int R_ >
class XCPoolAllocator
{
public:
void allocate( int size )
{
XTCPoolSingleton< sizeof( Tx_ ) >::Alloc< Tx_ >( (int)size );
XTCPoolSingleton< sizeof( int ) >::Alloc< Tx_ >( (int)size );
XTCPoolSingleton< R_ >::Alloc< Tx_ >( (int)size );
XTCPoolSingleton< sizeof( Tx_ ) >::IntAlloc( (int)size );
}
};
void Func() {
XCPoolAllocator< int, 4 > xxx;
xxx.allocate( 100 );
}
Köszi.
- 1222 megtekintés
Hozzászólások
Megoldva:
XTCPoolSingleton< sizeof( Tx_ ) >::template Alloc< Tx_ >( (int)size );
De még mindig nem értem, miért kell súgni a gcc-nek.
- A hozzászóláshoz be kell jelentkezni
(Megint tanultam valamit...)
Én sem... De érdekelne...
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
igy szol a szabvany.
dependent/ non-dependent names kornyeken kell keresgelni
- A hozzászóláshoz be kell jelentkezni
Innentől már csak az a kérdés, hogy miért szól így a szabvány, ha láthatóan nem okozott gondot bizonyos fordítóknak enélkül kitalálni a megoldást...
(Nem, C++ szabványról beszélve a "csak" nem válasz. :) )
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
Igazabol a dolog egy kicsit arnyaltabb ennel.
g++ -nak azert kell sugni, mert mas nevfeloldast hasznal mint a tobbi. g++ eseteben ez mar a definicio helyen megtorteneik, mig a tobbinel csak a peldanyositas helyen.
de igazabol lehet, hogy csak hulyesegeket irok.
- A hozzászóláshoz be kell jelentkezni
http://www.comeaucomputing.com/tryitout/ -nál bemásoltam a kódod, megnéztem, hogy milyen hibát dob : "type name is not allowed"
A http://www.comeaucomputing.com/techtalk/templates/ oldalon a
What is the ->template, .template and ::template syntax about?
rész szól erröl.
- A hozzászóláshoz be kell jelentkezni
Köszi, én nem találtam rá erre, kicsit tisztábban látok, bár a "miért"-re nem igazán válaszol...
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
Igen, a miért az sajnos nincs benne...
Nem világos teljesen ... ha találsz valamit, kitennéd ide?
( igazából egy olyan példát lenne jó találni, ami a szabvány ezen részéhez teljesen ragaszkodó fordítókkal működik, míg a többivel nem; bár meglehet, hogy ebből van a kevesebb :-) )
- A hozzászóláshoz be kell jelentkezni
http://womble.decadentplace.org.uk/c++/template-faq.html#dependent
en konkretan a 6. es 10. pontbol ideztem. bar lehet felreertettem.
- A hozzászóláshoz be kell jelentkezni
Ez szerintem másról szól (typename vs template). Persze köze lehet a dologhoz...
A Comeau oldalon ezt írják:
"The Standard requires it in this context, but if it's not, some compilers may still accept it (by figuring it out)."
Valami olyasmi lehet itt, mint a dupla template vs operator>> esetben, hogy a fordítók látják hogy mi a gond, de nem fogadják el, legalábbis a C++0x-ig...
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni