Próbuję publicznie wyprowadzić klasę z szablonu, który sprawi, że dziedziczy ona po klasie bazowej i uzyskuje dostęp do chronionych członków. Ale zanim to rozbudowany szablon nie ma tych praw, a więc nie można użyć elementu bazowego jako parametr szablonu:Dostęp do klasy bazowej szablonu przed rozwinięciem szablonu uzyskanego z
using Fun = void (*)();
class Base {
protected:
// friend class Derived; // ...need this to eliminate complaint
static void something();
};
template<Fun F>
class Variant : public Base {};
class Derived : public Variant<&Base::something> { // `something()` is protected
public:
void somethingElse() {
something(); // doesn't complain about this `something()`
}
};
int main() {}
Dziwne trochę o to, aby mnie było to, że Friending to działało w ogóle. Zastanawiałem się, czy mogę „podkradają Pochodzące w drzwiach”, umieszczając publiczne wirtualnego dziedziczenie z bazy przed Variant:
class Derived : public virtual Base, public Variant<&Base::something>
To nie pomogło.
Pytanie: jest jakiś inny trik na uniknięcie wyraźnej wzmianki o wszystkich klasach pochodnych w Bazie, ale nadal mieć dostęp do zabierania chronionych członków z niego dla parametrów szablonu?
(Uwaga:.. Próbując to na starszej GCC 4.6.3, wygląda nawet Friending nie pomoże w tym przypadku wydaje się więc, że obsługa jest dość nowy)
Powiązane: [CWG 372] (http://wg21.cmeerw.net/cwg/issue372) i [CWG 580] (http://wg21.cmeerw.net/cwg/issue580). Wydaje się, że nawet obecne wersje clang ++ i g ++ nie implementują proponowanej rozdzielczości dla tej drugiej wady. – dyp
@dyp Myślę, że to prawdopodobnie "odpowiedź" lub tak blisko, jak to tylko możliwe. Chcesz to zrobić? – HostileFork