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:

  1. Sposta inner al di fuori di outer e ne fanno una classe template. Io preferisco questo, perché l'impatto sul codice utilizzando è più piccolo.
  2. Aggiungi un to_string-metodo per interno.

Ci sono altre soluzioni per questo (che non danno luogo a brutto sintassi nel codice utilizzando)?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top