[C++] error C2064, te weinig argumenten voor functie?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Opifex
  • Registratie: September 2013
  • Laatst online: 11:53
Hellow allemaal,

Ik zit al enkele uurtjes te prutsen met multithreading werkend te krijgen in een C++ projectje.

code:
1
2
3
4
5
    MotionDetect *o = new MotionDetect;
    //thread motionDetectThread(o->detect);
    thread motionDetectThread(&MotionDetect::detect);

    thread communicatieThread(communicatie);


de communicatieThread, die een functie start in hetzelfde cpp bestand werkt perfect, maar de motionDetectThread, die een functie moet starten uit een andere klasse, krijg ik maar niet werkend.

Ik krijg steeds deze error:
Error 1 error C2064: term does not evaluate to a function taking 0 arguments E:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional 1149 1

Volgens wat ik uit google kan afleiden wil dit zeggen dat ik niet het juiste aantal argumenten meegeef voor de functie detect te starten, maar die neemt helemaal geen argumenten:

code:
1
    void detect();


Is er iets dat ik verkeerd doe/begrijp?

Alvast bedankt!


EDIT: @mods: Ik had eerst, zoals aangegeven staat in de richtlijnen van dit forum, de tag [C++] voor mijn titel geplaatst, maar had deze weggehaald omdat ik hieronder ook tag-functie zag staan. Na het posten blijkt echter dat dit niet hetzelfde is, maar ik kan het niet meer aanpassen. Kan iemand die dit leest dat in mijn plaats doen?

[ Voor 14% gewijzigd door Opifex op 23-02-2015 20:31 ]


Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 13:13
Wat probeer je precies te bereiken met &MotionDetect::detect? Tenzij detect een static functie is gaat het iig niet werken, lijkt me.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11:51
Ik snap je syntax niet (MS ding?), maar hoe ziet je MotionDetect class eruit? Is die detect functie wel static?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Opifex
  • Registratie: September 2013
  • Laatst online: 11:53
Caelorum schreef op maandag 23 februari 2015 @ 21:42:
Wat probeer je precies te bereiken met &MotionDetect::detect?
Ik probeer een thread te starten van de functie detect() in de klasse MotionDetect.
Tenzij detect een static functie is gaat het iig niet werken, lijkt me.
farlane schreef op maandag 23 februari 2015 @ 21:47:
Ik snap je syntax niet (MS ding?), maar hoe ziet je MotionDetect class eruit? Is die detect functie wel static?
Ze static maken stelde mijn docent inderdaad ook al voor, maar dat bleek toen niet te helpen. Ik wou het nu opnieuw proberen, maar nu geeft hij een error als ik ze static wil maken. Hij zegt dat dat keyword er niet mag staan.
code:
1
2
3
4
static void MotionDetect::test(int var)
{
    std::cout << var;
}

Komt het door die "MotionDetect::"? Als ik dat verwijder geeft hij geen error meer, maar dat lijkt me zo vreemd omdat dat hetgene is dat aanduid dat het tot die klasse behoort. Toch?

(@farlane: het is inderdaad in Visual Studio geschreven, maar maakt dit verschil dan? Is de syntax verschillend op Linux?)

EDIT: ik heb het gevonden! Blijkbaar mag je alleen static definen in de header, niet in de classfile zelf :)
En blijkbaar moeten alle functies die opgeroepen worden door een static function, ook static zijn :)
Weer wat bijgeleerd^^ (Ben nog maar een beginneling :) )

[ Voor 10% gewijzigd door Opifex op 23-02-2015 22:47 ]


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11:51
Hmmm, je mist een beetje basis geloof ik, maar dat komt wel. ;) Have fun :)


Tip : probeer te achterhalen *waarom* die dingen niet werkten.

[ Voor 31% gewijzigd door farlane op 23-02-2015 22:51 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 13:13
Ik zou inderdaad even opzoeken wat bet verschil is tussen een static en non-static functie. Als je dat eenmaal weet snap je wellicht ook waarom het nu wel werkt en waarom je vanuit een static functie alleen andere static functies kan aanroepen (behalve als je een (pointer naar) een object te pakken krijgt).

Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Simpel:
C++:
1
thread motionDetectThread(&MotionDetect::detect, o);

Als je o->detect() meegeeft als argument aan de thread dan wordt die expressie geevalueerd voordat het thread object gemaakt wordt. Dat is niet anders dan andere objecten. Maar als je de twee los meegeeft, dan zal het thread object de (member) functie en je object o combineren tot een functie aanroep in je nieuwe thread.

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


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Aanvulling: hoewel een pointer-to-member-function niet direct aanroepbaar is als een gewone functie, wordt hij meestal wel zo behandeld door verschillende constructies in <functional> (zoals std::function, std::bind en std::mem_fn), waarbij de 'this' als eerste argument wordt gebruikt.

Daardoor is zoiets mogelijk:
C++:
1
2
3
object o;
auto f = std::mem_fn(&object::foo);
f(&o); // calls o.foo();


Uiteindelijk wordt &MotionDetect::detect gegoten in een function object dat 1 argument verwacht: je this pointer. Dat is waarom MSalters suggestie werkt - je geeft extra argumenten voor de "functie" mee met de thread constructor.

Een tip wat betreft je foute topictitel: kan gebeuren :), maar gebruik de "Afbeeldingslocatie: http://tweakimg.net/g/forum/images/icons/icon_hand.gif Rapporteer" knop bovenaan de topic om dergelijke fouten door te geven aan moderators.

[ Voor 15% gewijzigd door .oisyn op 24-02-2015 16:46 ]

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.


Acties:
  • 0 Henk 'm!

  • Opifex
  • Registratie: September 2013
  • Laatst online: 11:53
farlane schreef op maandag 23 februari 2015 @ 22:51:[/b]
Hmmm, je mist een beetje basis geloof ik, maar dat komt wel. ;) Have fun :)


Tip : probeer te achterhalen *waarom* die dingen niet werkten.
Caelorum schreef op maandag 23 februari 2015 @ 22:54:
Ik zou inderdaad even opzoeken wat bet verschil is tussen een static en non-static functie. Als je dat eenmaal weet snap je wellicht ook waarom het nu wel werkt en waarom je vanuit een static functie alleen andere static functies kan aanroepen (behalve als je een (pointer naar) een object te pakken krijgt).
Ja, tuurlijk. Ik probeer altijd uit te vissen waarom een fout zich heeft voorgedaan, en waarom een oplossing werkte :)
MSalters schreef op dinsdag 24 februari 2015 @ 00:25:
Simpel:
C++:
1
thread motionDetectThread(&MotionDetect::detect, o);

Als je o->detect() meegeeft als argument aan de thread dan wordt die expressie geevalueerd voordat het thread object gemaakt wordt. Dat is niet anders dan andere objecten. Maar als je de twee los meegeeft, dan zal het thread object de (member) functie en je object o combineren tot een functie aanroep in je nieuwe thread.
Mhmmm, dat verklaart wel veel eigenlijk! Van wat ik op het internet kon afleiden was het 2de argument bij het aanmaken van een nieuwe thread een argument voor de functie waarvan de thread wordt opgestart, zoals hier bvb:
code:
1
2
3
4
5
6
std::thread t1(task1, "Hello");

void task1(std::string msg)
{
    std::cout << "task1 says: " << msg;
}
Een tip wat betreft je foute topictitel: kan gebeuren :), maar gebruik de "[afbeelding] Rapporteer" knop bovenaan de topic om dergelijke fouten door te geven aan moderators.
Had ik inderdaad ook kunnen doen. Zal er in het vervolg aan denken!

Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Het tweede argument is een argument voor een functie, als het eerste argument een gewone functie is. Maar als het eerste argument van std::thread een member functie is, dan is het tweede argument het object waarop die member functie moet worden aangeroepen.

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