Edit: sto usando TDM-gcc-4.7.1-2 per WindowsCome disambiguare più typedef ereditati da basi basate su modelli?
Non sai come risolvere questo. Mi piacerebbe usarlo come una sorta di lista di tipi che mi faccia sapere che sto tentando di usare un tipo non presente nei typedef di B
.
template <typename T, typename U>
struct A {
typedef pair<T, U> type;
};
struct B : A<int, string>, A<int, float> {};
B::type foo; // won't compile, ambiguous reference, as expected
B::A<int, int>::type bar; // compiles fine?? :(
C'è un modo per farlo fallire su A<int, int>
(e qualsiasi altro A
's non ereditate da B
), o di un altro modo per andare su questo? Immagino che potrei usare un tuple
e ricorrere in questo modo, facendo un confronto is_same
su ogni elemento rispetto a qualsiasi cosa nutro il metafunction, ma questo mi è sembrato più semplice ... all'inizio: \
dubito che 'B :: Un :: type' dovrebbe compilare a tutti ...'B :: A' è già ambiguo e non si riferisce al modello ma a una delle istanze da cui' B' deriva ... –
@ DavidRodríguez-dribeas Sono d'accordo, non vedo perché compili. Probabilmente mi manca una regola sepolta nello standard. –
Credo che la sezione sia 14.6.1-4 in bozza di C++ 11. Permette esplicitamente questo caso – jmetcalfe