Oto minimalne (C++ 14) kod, aby odtworzyć problem:odniesienia do funkcji "auto" jako parametr szablonu
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" Compiler emituje:
error: could not convert template argument ‘Foo<a>::value<bar>’ to ‘void (&)()’
template struct Foo<Foo<bar>::value>;
^
pierwszą rzeczą, którą zauważysz dziwne jest Foo<a>::value<bar>
- a
nie jest podstawiona, a value
jakoś stać się szablon?
Poniższe nonsensownych poprawki wzmacniają moje wrażenie, że jest to błąd kompilatora:
- Deklarowanie
value()
jako powrótvoid
zamiast wyciągania go - "wyłuskania"
value
:template struct Foo<*Foo<bar>::value>;
- Parenthesizing
value
:template struct Foo<(Foo<bar>::value)>;
- Tworzenie
a
wskaźnika:template <void (*a)()> struct Foo ...
Wreszcie, Clang kompiluje moje grzywny fragmentu.
Czy istnieje gdzieś gdzieś klauzula standardowa, która zabrania pierwszego fragmentu lub GCC właśnie na mnie umarł?
czy próbowałeś tego z klangiem? – hellow
@cookiesoft Jestem na dobrej drodze, aby spróbować. Edytuj: działa! – Quentin
I skompilowałem go z clang (wersja 3.5) i C++ 1y i skompilował. Nie wiem, czy skompilowane poprawnie, ale działa :) – hellow