Ho una classe che accetta un parametro di tipo template (tTRAIT). Voglio un amico un modello tipomembroalias di tTRAIT, ma non riesco a capire la sintassi. (E 'anche possibile?). Errore diC++: sintassi corretta per l'amicizia di un membro del tipo di modello del parametro del modello?
template <bool bBOOL>
struct SFoo {};
struct STrait
{
template <bool bBOOL>
using TFoo = SFoo<bBOOL>;
};
template <typename tTRAIT>
struct SBar
{
template <bool bBOOL>
friend typename tTRAIT::template TFoo<bBOOL>;
};
SBar<STrait> bar;
di Clang (sulla linea friend
) è:
error: friend type templates must use an elaborated type
ho cercato esaurire tutte le possibili combinazioni mi viene in mente:
friend tTRAIT::TFoo;
friend tTRAIT::template TFoo;
friend typename tTRAIT::TFoo;
friend typename tTRAIT::template TFoo;
template <bool bBOOL> friend tTRAIT::TFoo;
template <bool bBOOL> friend tTRAIT::TFoo<bBOOL>;
template <bool bBOOL> friend tTRAIT::template TFoo;
template <bool bBOOL> friend tTRAIT::template TFoo<bBOOL>;
template <bool bBOOL> friend typename tTRAIT::TFoo;
template <bool bBOOL> friend typename tTRAIT::TFoo<bBOOL>;
template <bool bBOOL> friend typename tTRAIT::template TFoo;
template <bool bBOOL> friend typename tTRAIT::template TFoo<bBOOL>;
Ho anche provato ad utilizzare using
, ma non sembra aiutare.
Come un brutto attacco (che funziona solo per i parametri bool), posso farlo funzionare ampliando manualmente ciascuna specializzazione.
friend typename tTRAIT::template TFoo<false>;
friend typename tTRAIT::template TFoo<true >;
Ma questo è schifo.
Qualcuno sa come farlo, o se questo può essere fatto?
Beh, questo è interessante e fastidioso, dal momento che sto usando attivamente "manualmente amico sia le specializzazioni vero e falso" con clang (3.7.0/C++ 1z) e è sicuramente un amico del tipo reale (non-alias). Forse è illegalmente bello per me? – xaxazak
I compilatori non compilano diverse versioni di codice per le classi e i loro alias (giusto?), Quindi per una classe e per il suo alias, entrambi possono vedere cose private o nessuna (dato che c'è una sola versione condivisa delle loro funzioni). Non puoi separarli. – xaxazak
Per la gestione manuale, funzionerà correttamente, poiché l'istanziazione del modello alias e il modello stesso saranno esattamente dello stesso tipo. Sono solo i modelli che sono distinti, le istanze non lo sono. – TartanLlama