2016-05-10 5 views
2

Ich habe eine harte Zeit, die Herkunft dieser Kompilierungsfehler zu verstehen.VC++ 2013 Fehler beim Verwenden der Member Initializer-Liste mit Lambda als Mitglied

folgender Code kompiliert ohne Probleme auf gcc-4.9.3 und Klirren-3.8 aber versagt auf VS 2013.

class Sample 
{ 
    public: 
     template<typename T> 
     explicit Sample(T& in) : 
     x(in), 
     lamb([](Sample& ss) 
     {               
      std::cout << "This works !!\n" << static_cast<const T&> (ss.get()) << std::endl; 
     }){} 

     const int get() const { return x; } 
    private: 
     int x; 
     std::function<void(Sample&)> lamb; 
}; 

int main() 
{ 
    int z = 10; 
    Sample a(z); 
    return 0; 
} 

ich mit folgenden Fehlern am Ende:

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
error C2061: syntax error : identifier 'T' 

Die MSDN Erklärung für diese Fehler hat nicht viel geholfen. Was mache ich hier falsch?

+2

[Compiliert] (http://melpon.org/wandbox/permlink/OAkFvu1qV9ESP7Pc) [ohne] (http://melpon.org/wandbox/permlink/LUNHOZZie6GL93E9) [Probleme ] (http://melpon.org/wandbox/permlink/THuTNjFlnhTnokAB), tatsächlich. –

+0

Hoppla ... :) :) Ich habe die Frage mit einem Schnipsel aktualisiert, der sich in der Tat gut auf gcc und clang anpasst. Immer noch Fehler auf VS 2013. – Recker

+0

http://webcompiler.cloudapp.net/ verwendet VS und es zeigt die tatsächliche Fehlermeldung, die es klar macht, dass das Lambda nicht das Vorlagenargument T des Konstruktors verwenden kann (die Zeile mit der statischen Besetzung) As ob es sollte, ich würde mit clang und gcc gehen, aber das ist eine persönliche meinung ohne grund. –

Antwort

1

Es sieht aus, dass Visual Studio keine Informationen über Vorlagentyp T an Lambda weiterleitet. Ich habe die Klassenvariable an Lambda übergeben, um benötigte Typinformationen zu sammeln. So etwas wie dies funktioniert:

#include <functional> 
#include <iostream> 

class Sample 
{ 
    public: 
     template<typename T> 
     explicit Sample(T& in) : 
     x(in), 
     lamb([this](Sample& ss) 
     {               
      std::cout << "This works !!\n" << static_cast<decltype(x)> (ss.get()) << std::endl; 
     }){} 

     const int get() const { return x; } 
    private: 
     int x; 
     std::function<void(Sample&)> lamb; 
}; 

int main() 
{ 
    int z = 10; 
    Sample a(z); 
    return 0; 
} 
+0

Gott segne [decltype] (http://en.cppreference.com/w/cpp/language/decltype) .... – Recker

Verwandte Themen