Ecco il codice minimo (C++ 14) per riprodurre il problema:riferimento ad una funzione di "auto" come parametro di template
template <void (&a)()>
struct Foo {
static auto value() {}
};
void bar() {}
template struct Foo<Foo<bar>::value>;
GNU C++ "g ++ (Ubuntu 5.1.0-0ubuntu11 ~ 14.04.1) 5.1.0" compilatore emette:
error: could not convert template argument ‘Foo<a>::value<bar>’ to ‘void (&)()’
template struct Foo<Foo<bar>::value>;
^
La prima cosa strana che noto è Foo<a>::value<bar>
-a
non viene sostituito, e value
ha in qualche modo diventare un modello?
le seguenti correzioni senza senso rafforzano la mia impressione che si tratta di un bug del compilatore:
- Dichiarare
value()
come tornarevoid
invece di dedurre che - "Dereferenziare"
value
:template struct Foo<*Foo<bar>::value>;
- mettere tra parentesi
value
:template struct Foo<(Foo<bar>::value)>;
- Fare
a
un puntatore:template <void (*a)()> struct Foo ...
Infine, Clang compila il mio snippet.
Quindi, c'è qualche oscura clausola standard da qualche parte che vieta il primo frammento o GCC è appena morto su di me?
hai provato con clang? – hellow
@cookiesoft Sto andando a provarlo. Modifica: funziona! – Quentin
L'ho compilato con clang (versione 3.5) e C++ 1y e compilato. Non so, se è compilato correttamente, ma funziona :) – hellow