Se creo un membro puntatore-base, è possibile convertirlo in un membro puntatore-derivato in genere, ma non quando viene utilizzato all'interno di un modello come Buzz in basso, dove il primo argomento del modello influenza il secondo. Sto combattendo i bug del compilatore o lo standard impone davvero che questo non funzioni?Perché non posso eseguire il downcast del puntatore ai membri negli argomenti del modello?
struct Foo
{
int x;
};
struct Bar : public Foo
{
};
template<class T, int T::* z>
struct Buzz
{
};
static int Bar::* const workaround = &Foo::x;
int main()
{
// This works. Downcasting of pointer to members in general is fine.
int Bar::* y = &Foo::x;
// But this doesn't, at least in G++ 4.2 or Sun C++ 5.9. Why not?
// Error: could not convert template argument '&Foo::x' to 'int Bar::*'
Buzz<Bar, &Foo::x> test;
// Sun C++ 5.9 accepts this but G++ doesn't because '&' can't appear in
// a constant expression
Buzz<Bar, static_cast<int Bar::*>(&Foo::x)> test;
// Sun C++ 5.9 accepts this as well, but G++ complains "workaround cannot
// appear in a constant expression"
Buzz<Bar, workaround> test;
return 0;
}
Decisamente giusto, ma qualche idea del perché non è permesso? Sembra arbitrario. –
@Joseph: Anch'io ho pensato che fosse così, motivo per cui ho anche controllato C++ 0x. (Hanno rimosso molte decisioni apparentemente arbitrarie, come nessun parametro predefinito per i modelli di funzione.) Nessuno ha trovato un uso per questo e quindi non è davvero cambiato/quindi semplicemente non è stato spinto per (è più facile aggiungere un well- funzionalità testata piuttosto che deprecare una funzionalità interrotta), o c'è qualche motivo fondamentale che non riesco a vedere. – GManNickG