Biorąc pod uwagę te definicjeKiedy możesz wyspecjalizować szablon dla prywatnego typu członka?
template<class T> class foo {};
template<class T> class foo1 { static int i; };
class bar { class baz {}; };
Jestem zaskoczony, że ten kompiluje
template<>
class foo<bar::baz> {};
ale to się nie powiedzie się z powodu błędu 'class bar::baz' is private
template<>
int foo1<bar::baz>::i = 42;
Kiedy to się dzieje, i jest tam obejście inne niż uczynienie tego typu publicznym?
To * jest * interesujące. Rozumiem, że to błąd definiujący zmienną tej klasy. Tj. 'Foo {};' jest OK (g ++), ale wtedy 'foo f;' nie jest. Tak więc jest to typ bezużyteczny i wygląda na to, że błąd pojawia się stosunkowo późno (tj. Nie w definicji klasy). –
@AmiTavory Nie nadaje się do użytku, ponieważ zawsze możesz dodać [publiczny typ aliasu] (http://coliru.stacked-crooked.com/a/22807544d8414c4e). Ale ciekawe pytanie. Dlaczego istnieje kontrola dostępu do specjalizacji dla ':: i'? –
@DanielFrey Rozumiem, że pytanie dotyczy przypadku bez modyfikowania kodu 'bar'. –