È possibile in qualche modo rendere una specifica di modello parziale una classe di amici? Cioè considera si ha la seguente classe templateModelli C++: Specifiche dei modelli parziali e classi di amici
template <class T> class X{
T t;
};
Ora avete specializzazioni parziali, per esempio, per i puntatori
template <class T> class X<T*>{
T* t;
};
Quello che voglio realizzare è che ogni possibile X<T*>
è un amico classe di X<S>
per QUALSIASI S
. Cioè X<A*>
dovrebbe essere un amico di X<B>
.
Naturalmente, ho pensato a un normale amico dichiarazione di modello in X:
template <class T> class X{
template <class S> friend class X<S*>;
}
Tuttavia, questo non si compila, g ++ mi dice questo:
test4.cpp: 34: 15: errore : la specializzazione di 'template<class T> class X
' deve apparire in ambito namespace
test4.cpp: 34: 21: errore: la specializzazione parziale 'X<S*>
' dichiarato 'amico'
Non è affatto possibile o c'è qualche soluzione?
Il motivo per cui chiedo è che ho bisogno di un costruttore in X<T*>
che crea questa classe da un arbitrario X<S>
(S
deve essere un sottotipo di T
).
Il codice simile a questo:
template <class T> class X<T*>{
T* t;
template<class S>
X(X<S> x) : t(&(x.t)) {} //Error, x.t is private
}
Ora, il compilatore si lamenta, naturalmente, che x.t
non è visibile nel costruttore dal momento che è privato. Questo è il motivo per cui ho bisogno di una classe di amici di specializzazione parziale.
Una funzione 'get' è davvero fuori questione? Questo mi sembra molto più pulito ed evita tutte le follia degli amici del template. – pmr
potrebbe funzionare in questo esempio, forse. Tuttavia, potrebbero esserci dati che non dovrebbero essere esposti al pubblico ma solo a specializzazioni di modelli. La domanda è se questo comportamento è possibile in qualche modo. – gexicide