[C++] Function template instantiation

Pagina: 1
Acties:

  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 08:05

GrimaceODespair

eens een tettenman, altijd ...

Topicstarter
Ik heb een class met een constructor en een template member function, ongeveer als volgt:

C++:
1
2
3
4
5
6
class X
{
public:
    X() { f<1>(); }
    template<int i> int f() { /* doSomething */ }
}


Ik gebruik de VC++ 6.0 compiler om dit stukje te compileren, maar ik krijg de template instantiation van f<1> niet aan de gang. Als ik bovenstaand stukje compileer, klaagt de compiler over syntax fouten. Om hem tegemoet te komen heb ik dan maar eens wat onjuiste code geprobeerd, en met onderstaande wijziging compileert hij wel.
C++:
1
    X() { f<1>(1); }

Hij slaat echter bij het debuggen functie f over.

Het lijkt onmogelijk om functies op deze manier te instantiëren, want andere syntaxvariaties krijg ik ook gecompileerd, maar dan met warnings die doen vermoeden dat '<' en '>' als operator geïnterpreteerd worden.

Omdat de template een integer verwacht, kan ik ook niet aan automatische instantiëring laten doen. Iemand een idee hoe ik het best rond dit irritante probleem kan werken? Of doe ik misschien gewoon iets 100% fout?

Wij onderbreken deze thread voor reclame:
http://kalders.be


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Je bent de puntkomma achter class { } vergeten. Voor de rest werkt en compileert je code perfect (hier op VMS compiler iig ;) ).

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Trouwens pluspunten voor het netjes laten zien van die 'wazige syntax error', enne VS6 is 'known to be brak' met templates.

Professionele website nodig?


  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 08:05

GrimaceODespair

eens een tettenman, altijd ...

Topicstarter
Ok, sorry voor het niet verbose laten zien van de syntax errors. Ik had er ondertussen al zoveel verschillende gegenereerd, dat ik ze hier niet zomaar lomp de layout wou laten verneuken. Maar bovenstaande code genereert bij mij bijvoorbeeld
error C2059: syntax error : ')'
op de regel 4, zelfs met de punt-komma O-) (overtikfoutje).

Voor de volledigheid zet ik hier nog eens de exact gecopy-paste code neer die ik compileer:
C++:
1
2
3
4
5
6
class X 
{ 
public: 
    X() { f<1>(); } 
    template<int i> int f() { /* doSomething */ } 
};

En ja, ik weet dat de VC compiler een brakke template implementatie heeft, maar je weet maar nooit of hier mensen rondslingeren met een beproefde oplossing voor dit probleem.

Wij onderbreken deze thread voor reclame:
http://kalders.be


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Volgens mij is het deze bug. Heb niet echt tijd om ernaar te kijken dus ik kan fout zitten overigens.

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Geef het maar op, VC6 ondersteunt geen explicit template arguments bij functies, dus al helemaal geen integral arguments :)

Het werkt alleen met types, en alleen als die typen onderdeel zijn van de functieargumenten, zodat de compiler zelf de template argumenten kan bepalen aan de hand van de functieargumenten die je meegeeft

[ Voor 61% gewijzigd door .oisyn op 26-08-2003 13:41 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 08:05

GrimaceODespair

eens een tettenman, altijd ...

Topicstarter
.oisyn schreef op 26 August 2003 @ 13:40:
Geef het maar op, VC6 ondersteunt geen explicit template arguments bij functies :)
Exact wat ik nodig had. Dag, prachtige recursieve template class waar ik net een hele ochtend aan geprogd heb. :'(

tnx anyway oisyn ;)

Wij onderbreken deze thread voor reclame:
http://kalders.be


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Upgrade naar vs.net 2003. Dat is echt een enorme verbetering ten op zicht van vs6. Nog niet helemaal conform de standaard, maar dat is voornamelijk bij dingen die vs.net 2003 wel toelaat die eigenlijk niet mogen, ipv dingen die wel zouden kunnen die niet ondersteund worden... En het ondersteunt eindelijk partial template specialization >:)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Yep, zowel VC7.0 als VC7.1 hebben hier geen moeite mee. Wie een compiler uit de vorige eeuw wil gebruiken heeft helaas een probleem, want curry684 had precies de bug in kwestie te pakken.

.oisyn, je ziet het iets te zwart in. VC6 kan wel met expliciete argumenten omgaan, daar is de T* dummy = 0 hack voor uitgevonden. ( De workaround van Microsoft zelf werkt niet voor de meeste classes, en maakt bovendien onnodig een object aan. T* is maar 4 bytes)

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1