Soluzione per il modello argomento deduzione nel contesto non dedotta
-
25-10-2019 - |
Domanda
Si consideri il seguente codice:
#include <iostream>
template<class T>
struct outer {
struct inner {};
};
template<class T>
std::ostream& operator<<(std::ostream & stream,
typename outer<T>::inner const& value) {
std::cout << "An outer::inner!";
return stream;
}
int main() {
outer<float>::inner foo;
std::cout << foo << std::endl; // does not compile
}
Questa non compilare, perché typename outer<T>::inner
è un contesto nondeduced (come spiegato qui ), vale a dire il modello-argomentazione di tipo non può essere dedotto dal compilatore (leggi questa risposta per il perché). Come la vedo io, ho due opzioni per farlo funzionare:
- Sposta
inner
al di fuori diouter
e ne fanno una classe template. Io preferisco questo, perché l'impatto sul codice utilizzando è più piccolo. - Aggiungi un
to_string
-metodo per interno.
Ci sono altre soluzioni per questo (che non danno luogo a brutto sintassi nel codice utilizzando)?
Soluzione
È possibile spostare l'operatore nel corpo classe interna e mettere friend
prima. Quindi sostituire il tipo di parametro da solo inner
.
Un'altra tecnica consiste nel derivare interno da una base CRTP parametrizzata da interno. Poi fanno digitare il parametro della classe CRTP e gettato il riferimento dei parametri alla classe inner
derivata, il tipo di che è dato dall'argomento modello che si dedurre.