2015-07-04 16 views
6

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ót void 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ł?

+0

czy próbowałeś tego z klangiem? – hellow

+0

@cookiesoft Jestem na dobrej drodze, aby spróbować. Edytuj: działa! – Quentin

+0

I skompilowałem go z clang (wersja 3.5) i C++ 1y i skompilował. Nie wiem, czy skompilowane poprawnie, ale działa :) – hellow

Odpowiedz

Powiązane problemy