2017-09-07 10 views
15

Według [temp.deduct.guide/3]:Jak zapewnić przewodnik dedukcji dla zagnieżdżonej klasy szablonów?

(...) Odliczenie-przewodnik powinien być zadeklarowany w tym samym zakresie jak odpowiedniego szablonu klasy, a do szablonu klasy członka, z taki sam dostęp. (...)

Ale poniżej przykład nie wydaje się kompilować zarówno w [gcc] i [clang].

#include <string> 

template <class> 
struct Foo { 
    template <class T> 
    struct Bar { 
     Bar(T) { } 
    }; 
    Bar(char const*) -> Bar<std::string>; 
}; 

int main() { 
    Foo<int>::Bar bar("abc"); 
    static_cast<void>(bar); 
} 

Jaka jest prawidłowa składnia przewodnika odliczeń dla zagnieżdżonej klasy szablonów? A może ten jest poprawny, ale nie jest jeszcze obsługiwany przez kompilatory?


Podobny składnia ale bez zagnieżdżonych klasy kompiluje dobrze zarówno w gcc i brzękiem:

#include <string> 

template <class T> 
struct Bar { 
    Bar(T) { } 
}; 
Bar(char const*) -> Bar<std::string>; 

int main() { 
    Bar bar("abc"); 
    static_cast<void>(bar); 
} 
+0

W GCC jest to błąd polegający na tym, że deklarujesz funkcję. –

+0

@Someprogrammerdude Nie jestem pewien, czy jest to poprawna składnia - nie ma odpowiedniego przykładu w standardzie, ale wspomina o sytuacji ... –

+0

Zagnieżdżony przewodnik dedukcji szablonów działa, jeśli klasa nadrzędna nie jest szablonowana .... – AndyG

Odpowiedz

11

[temp.deduct.guide] zawiera zdanie:

odliczenie-guide zgłasza się w tym samym zakres jako odpowiedni szablon klasy i dla szablonu klasy członka z tym samym dostępem.

Sugeruje to, że przykład powinien działać - prowadnice odliczenia są wyraźnie wspierane przez szablonów klas członkiem, tak długo jak są one zadeklarowane w tym samym zakresie i dostępem (co byłoby zakres klasy i public - kontrola i sprawdzenie).

To jest gcc bug 79501 (złożony przez Richarda Smitha).

+0

Przykład złożony przez Richarda wydaje się kompilować w clang ... –

+2

@WF Twoja zewnętrzna klasa jest szablonem klasy, przykład w tym błędzie jest prostszy. Powinien zgłosić błąd llvm. – Barry

+0

Tak, to zdecydowanie sugeruje, że składnia powinna być poprawna. Spróbuję złożyć błąd, a następnie ... –

Powiązane problemy