Sto provando a ricavare pubblicamente una classe da un modello che verrà ereditata da una classe base e ottenere l'accesso ai membri protetti. Ma prima che il modello è espansa non ha questi diritti, in modo che non è possibile utilizzare un membro di base come parametro di template:Accesso alla classe base del modello prima dell'espansione del modello derivato da
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() {}
L'po 'strano su questo per me era che friending ha funzionato affatto. Mi chiedevo se potessi "Sneak Derivato dalla porta" mettendo un'eredità virtuale pubblica dalla base prima della Variante:
class Derived : public virtual Base, public Variant<&Base::something>
quello non ha aiutato.
Domanda: C'è qualche altro trucco per evitare la menzione esplicita di tutte le classi derivate in Base, ma ancora avere accesso per scegliere membri protetti da esso per i parametri del modello?
(Nota:.. Provando questo su un gcc più vecchia, 4.6.3, sembra che anche il friending non aiuta in questo caso Così sembra il supporto per che è un po nuovo)
Correlati: [CWG 372] (http://wg21.cmeerw.net/cwg/issue372) e [CWG 580] (http://wg21.cmeerw.net/cwg/issue580). Sembra che anche le versioni correnti di clang ++ e g ++ non implementino la risoluzione proposta per quest'ultimo difetto. – dyp
@ dyp Sto pensando che probabilmente è "la risposta" o il più vicino possibile. Vuoi farcela? – HostileFork