2015-01-14 11 views
10

Ho un codice che funziona in GCC ma non riesce a compilare in Visual Studio 2015 (che realizzo è in sviluppo ma questa area I è dovrebbe essere implementato).E 'il compilatore o solo io: Ereditato dal modello variadic composto da lambda

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; 
} 

Questo è lo snippet di codice ridotto alla pura essenza di esso. Visual Studio dice "Errore di sintassi: 'digita'" sul costruttore di inherit. Sputa poi una piccola traccia di come è arrivato lì e conclude con "non puoi costruire un'istanza di un lambda".

La mia ipotesi è che l'espansione di T (t) ... non si espanda correttamente. Tuttavia, potrei aver sbagliato la sintassi.

MODIFICA: Siamo spiacenti, la domanda è: sono in colpa qui o no? In tal caso, qual è la sintassi corretta?

RICERCA AGGIUNTIVA: In linea con le risposte che ho avuto, sembra che si sia verificato un problema con Visual Studio 2015 che presenta un bug in quest'area. Nel test sembra che sia l'espansione in cui i parametri del costruttore vengono passati alle classi base lambda che stanno avendo il problema. Il seguente test funziona con 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

Sembra buono, anche clang ++ lo accetta. Cosa succede quando togli la variadicità, ma lasci entrare i lambda? – dyp

+0

Penso che Visual Studio abbia un problema quando si passa un lambda in determinati casi https://connect.microsoft.com/VisualStudio/feedback/details/727957/vc11-beta-compiler-fails-to-compile-lambda-key- comparer-for-maps-and-sets http://stackoverflow.com/questions/25777396/passing-my-compar-function-to-stdmultiset-with-c11/25777512#comment43645224_25777512 – AndyG

+3

Il tuo codice è stato supportato da gcc 4.6 e clang 3.1 (entrambi dall'inizio del 2012). Visual C++ è in esecuzione da 3 anni qui. – TemplateRex

risposta

0

È il compilatore. A more recent MSVC, v. 19.00.23106.0 da luglio 2015, accetta il tuo esempio così com'è.

Forse la sintassi di inizializzazione del brace T{t}... avrebbe aiutato. Non riesco a trovare un compilatore online adatto per provare, però.

Problemi correlati