gcc template para

 ( Joejszaka | 2009. szeptember 2., szerda - 11:29 )

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.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Megoldva:

XTCPoolSingleton< sizeof( Tx_ ) >::template Alloc< Tx_ >( (int)size );

De még mindig nem értem, miért kell súgni a gcc-nek.

(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

igy szol a szabvany.
dependent/ non-dependent names kornyeken kell keresgelni

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

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.

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.

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

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

http://womble.decadentplace.org.uk/c++/template-faq.html#dependent

en konkretan a 6. es 10. pontbol ideztem. bar lehet felreertettem.

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