2017-03-08 1 views
2

Ich habe gestern einige Testfunktionals implementiert und alles kompiliert und funktionierte gut ohne Fehler. Heute kam ich zurück zu meinem PC und meine std::bind sind rot unterstrichen aber kompilieren ohne Fehler. Scheint so, als ob Intellisense und der Compiler dem Typ std::bind nicht zustimmen. Wie kann ich das beheben?falsch-positiven Fehler mit Std :: funktional in vs2015

#include <functional> 

class MyClass { 
public: 
    int doE() { 
     return 0; 
    } 

    int doF() { 
     return 1; 
    } 
}; 


void main() 
{ 
    MyClass obj; 
    std::function<int()> f = std::bind(&MyClass::doE, obj); // underlined red 
    std::cout << f(); 
} 

Die Fehlermeldung lautet wie folgt:

Error (active) 
    no suitable user-defined conversion from "std::_Binder<std::_Unforced, int (MyClass::*)(), MyClass &>" to "std::function<int()>" exists 
    functionals 
    c:\functionals\functionals\thirdFunctionOnObject.h 

Ich habe nicht den gleichen Fehler-Typ (Intellisense sagen, es ist ein Fehler, aber es kompiliert just fine) in anspruchsvollere Codes , wo ich std::mem_fn().

+1

Intellisense kann normalerweise sicher ignoriert werden. Es ist fast völlig nutzlos. –

+2

Der Visual Studio IntelliSense-Parser ist nicht derselbe wie der Visual C++ - Compiler. IntelliSense kann manchmal denken, dass gültiger Code ungültig ist, und dies als Fehler melden. –

+0

Versuchen Sie, ein Lambda anstelle von 'std :: bind 'zu verwenden, da es sehr wenig Gründe gibt,' std :: bind' über Lambda zu verwenden, außer obskuren Brüchen, die durch 'std :: bind'-Macken, komplexe und unlesbare Fehlermeldungen verursacht werden 'std :: bind' Fehler und allgemeiner Masochismus? – Yakk

Antwort

1

Hatte das gleiche Problem mit VS 2015 C++, ich hasse es. Microsoft macht mich verrückt.

Für jetzt verwende ich eine böse Arbeit um den Code zu einer statischen Funktion zu bewegen. In Ihrem Fall wird es der folgenden ähneln:

class MyClass { 
    // other code 

    int doE() { 
     return 0; 
    } 

    static int statDoE(MyClass * myClass) { 
     return myClass->doE(); 
    } 

}