Toon posts:

[C++] template + default argument probleemcode

Pagina: 1
Acties:

Verwijderd

Topicstarter
Is het volgende programma een correct c++ programma ?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class A> struct reader
{
        template <class rt> reader (rt(A::*)() = A::read) {}
};

struct s
{
    void read () {}
};

int main ()
{
    new reader<s>;
}

Borland C++ compiled de template class wel, maar geeft bij het aanmaken van een instance (in main dus) de error:
Could not find a match for 'reader<s>::reader()' in function main()
Visual C++ weigert zelfs de template class zelf te compilen.

Waarom ?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 20:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

na-aper ;)

[serieus mode aan]

Wel een vage constructie... wat wil je er eigenlijk mee bereiken?


okee wacht, je hebt dus een template class reader, en die heeft in de constructor als argumenten een pointer-naar-memberfunctie

Dat ie die error in Borland C++ geeft klopt volgens mij wel... hij weet namelijk niet wat ie voor rt moet kiezen in de constructor.... hmmm maar aan de andere kant, je roept sowieso al geen constructor aan...
Helpt het niet als je ook nog een lege constructor aanmaakt?
code:
1
2
3
4
5
template <class A> struct reader
{
    reader () { }
    template <class rt> reader (rt (A::*)() = A::read) { }
};

.edit: okee ik zie trouwens een fout: die rt (A::*) () heeft geen naam, het is alleen een type. Doe dus iets als

template <class rt> reader (rt (A::*readfunc)() = A::read) { }

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.


Verwijderd

Topicstarter
gcc zegt:
In function `int main()':
no matching function for call to `reader<s>::reader ()'
candidates are: reader<s>::reader(const reader<s> &)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 20:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

ja dat is dus omdat er geen lege constructor is

jij doet new reader<s>
en dan zoekt ie (volgens mij dan) naar een lege constructor, maar die is er niet

vergeet trouwens ook niet mijn edit te lezen in mijn vorige post :)

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.


Verwijderd

Topicstarter
OiSyN:
Weet jij eigenlijk wel wat default arguments zijn ?
En wist je niet dat functie parameters niet per se een naam hoeven te hebben ?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 20:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op woensdag 12 september 2001 21:22 schreef Sneech het volgende:
OiSyN: weet jij eigenlijk wel wat default arguments zijn ? en wist je niet dat functie parameters niet per se een naam hoeven te hebben ?
ik weet wat default parameters zijn, en ik weet ook dat als je een functie definieert (dus met { } erachter) het wel handig is als je ook een variabelenaam hebt :)

Oh wacht ik snap nu ineens wat je bedoelt, en dan snap ik ook wat de oplossing is: je moet ook een default type voor rt maken in de template (stom stom stom stom |:( van mezelf dan he) :+

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.


Verwijderd

Topicstarter
Voor alle duidelijkheid, dit:
code:
1
void f (int) {}

is hardstikke legaal, geen enkel probleem.

Verder kun je een constructor die alleen maar default arguments heeft gebruiken als constructor zonder argumenten (daarvoor zijn het tenslotte default arguments).

En OiSyN: Het type rt zou gehaald moeten kunnen worden uit de default argument (A::read), toch ?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 20:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op woensdag 12 september 2001 21:30 schreef Sneech het volgende:
Voor alle duidelijkheid, dit:
code:
1
void f (int) {}

is hardstikke legaal, geen enkel probleem.

Verder kun je een constructor die alleen maar default arguments heeft gebruiken als constructor zonder argumenten (daarvoor zijn het tenslotte default arguments).

En OiSyN: Het type rt zou gehaald moeten kunnen worden uit de default argument (A::read), toch ?
ik weet dat dat legaal is, maar aangezien je er in je echte source file waarschijnlijk nog wel code tussen je { en je } had staan die waarschijnlijk ook wel gebruik maakte van die variabele, heeft ie dus een naam nodig, vandaar

En het type rt kan volgens mij niet zo van A::read gehaald worden... Ik denk dat je dan meer iets moet zoeken in de trand van

template <class rt = typeof (A::read ())> ....

maar ik weet niet of dat zo wel werkt met typeof (lijkt me wel overigens)

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.


Verwijderd

Topicstarter
Typeof is een GNU extensie, en niet ISO C++, dus daar begin ik niet aan.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 20:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

tja....

dat het niet het type kan bepalen is waarschijnlijk omdat he return-type niet bij de functie-specificatie hoort... je kunt ook niet 2 functies overloaden die alleen maar verschillen in het return-type

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.

Pagina: 1