2015-01-14 2 views
10

Ich habe einige Code, der unter GCC funktioniert aber nicht unter Visual Studio 2015 kompilieren (was ich realisiere ist in-Entwicklung, aber dieser Bereich I denken ist soll umgesetzt werden).Ist es der Compiler oder nur ich: Vererbung von Variadic Vorlage bestehend aus Lambdas

template< typename... T > 
class inherit : public T... 
{ 
public: 
inherit(T... t) : T(t)... {} 
}; 

int main() { 
    auto l1 = []() {}; 
    auto l2 = []() {}; 
    inherit<decltype(l1), decltype(l2)> test(l1, l2); 
    return 0; 
} 

Das ist das Code-Snippet, das auf die reine Essenz reduziert wurde. Visual Studio sagt "Syntaxfehler: 'Typ'" im Erbauerkonstruktor. Es spuckt dann eine kleine Spur aus, wie es dahin gekommen ist und schließt mit "Sie können keine Instanz eines Lambda konstruieren".

Meine Annahme ist, dass die Erweiterung von T (t) ... nicht richtig erweitert wird. Allerdings kann ich die Syntax falsch verstehen.

EDIT: Sorry die Frage ist: Bin ich Schuld hier oder nicht? Wenn ja, wie lautet die korrekte Syntax?

ZUSÄTZLICHE FINDUNG: In Übereinstimmung mit den Antworten, die ich hatte, scheint dies ein Problem mit Visual Studio 2015 einen Fehler in diesem Bereich zu haben. Beim Testen scheint es die Erweiterung zu sein, in der die Konstruktorparameter an die Lambda-Basisklassen übergeben werden, die das Problem haben. Der folgende Test funktioniert unter VS2015:

template< typename T1, typename T2, typename... T3 > 
class inherit2 : public T3... 
{ 
public: 
    inherit2(T1 t1, T2 t2) : T1(t1), T2(t2) {} 
}; 

int main() { 
    auto l1 = []() {}; 
    auto l2 = []() {}; 
    inherit2<decltype(l1), decltype(l2), decltype(l1), decltype(l2)> test(l1, l2); 
    return 0; 
} 
+2

Sieht gut aus, clang ++ akzeptiert es auch. Was passiert, wenn Sie die Varianz entfernen, aber die Lambdas lassen? – dyp

+0

Ich denke Visual Studio hat ein Problem, wenn Sie in bestimmten Fällen ein Lambda übergeben https://connect.microsoft.com/VisualStudio/feedback/details/727957/vc11-beta-compiler-fails-to-compile-lambda-key- Vergleichen-for-maps-and-sets http://stackoverflow.com/questions/25777396/passing-my-compar-function-to-stdmultiset-with-c11/25777512#comment43645224_25777512 – AndyG

+3

Ihr Code wurde seit gcc 4.6 und unterstützt clang 3.1 (beide Anfang 2012). Visual C++ läuft hier 3 Jahre. – TemplateRex

Antwort

0

Es ist der Compiler. A more recent MSVC, v. 19.00.23106.0 von Juli 2015, akzeptiert Ihr Beispiel wie es ist.

Vielleicht hätte Klammerinitialisierungssyntax T{t}... geholfen. Ich kann jedoch keinen geeigneten Online-Compiler finden.

Verwandte Themen