Referenz-Rückgabetyp bei std::future



  • Hiho,

    folgende Sache:

    ich habe eine Methode mit folgender Signatur:

    virtual const MarkerVec& calcCurrCameraPosition(ImageBuffer imageBuffer, CameraFormat format, Resolution resolution) = 0;
    

    MarkerVec ist einfach ein Typedef für einen std::vector mit einer struct von mir.

    Ich rufe die Methode mit async auf:

    m_trackingResult = std::async(std::launch::async, [this, format]()
    			{
    				return CArManager::getInstance().getCurrentTracker()->calcCurrCameraPosition(
    					m_preproc.getTrackerImage(),
    					format,
    					m_preproc.getTrackerImageResolution());
    			});
    

    m_trackingResult ist definiert als

    std::future<const ITracker::MarkerVec&> m_trackingResult;
    

    Mein VS2015 quittiert das ganze mit

    1>g:\quellcode\augmented reality\arviewerwx\arviewer\ogrecontrol.cpp(294): error C2679: Binärer Operator "=": Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ "std::futureITracker::MarkerVec" akzeptiert (oder keine geeignete Konvertierung möglich)
    1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\future(1200): note: kann "std::future<const ITracker::MarkerVec &> &std::future<const ITracker::MarkerVec &>::operator =(const std::future<const ITracker::MarkerVec &> &)" sein
    1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\future(1173): note: oder "std::future<const ITracker::MarkerVec &> &std::future<const ITracker::MarkerVec &>::operator =(std::future<const ITracker::MarkerVec &> &&) noexcept"
    1> g:\quellcode\augmented reality\arviewerwx\arviewer\ogrecontrol.cpp(294): note: bei Anpassung der Argumentliste "(std::future<const ITracker::MarkerVec &>, std::futureITracker::MarkerVec)"

    Ist es generell verboten, Referenzen als Rückgabetyp zu definieren? Ich habe das Problem vorerst gelöst, indem ich den Zeiger speichere anstatt der Referenz, würde aber trotzdem gerne meinen Denkfehler bei dieser Variante wissen wollen.

    VG

    Pellaeon



  • Ich bin kein std::future Experte aber was passiert wenn du das ganze als

    std::future<ITracker::MarkerVec> m_trackingResult;
    

    definierst? Das ist zumindest der Rückgabewert den ich der Fehlermeldung entnehme.



  • Mh. Wahrscheinlich kriegst du dann eine Kopie die du gar nicht willst. Zur Not das Ganze in einen std::reference_wrapper packen.



  • OK jetzt hab ich es. Referenzen in std::future sind erlaubt aber das "Problem" hier ist deine Lambda Function. Da du keinen expliziten Rückgabewert angegeben hast wird dieser als ITracker::MarkerVec gewählt. Wenn du den Rückgabewert explizit als const MarkerVec& angibst müsste es gehen.


Log in to reply