Domanda

Sto usando CppUnit per testare una classe nel mio programma. Questa classe (SCriterionVal) è in qualche modo unico perché ha gli operatori di conversione per un sacco di tipi (è essenzialmente un tipo di classe valore dinamico). Quando compilo casi di test che mettono alla prova utilizzando CPPUNIT_ASSERT_EQUAL(), ottengo gli errori di compilazione su "operator<< è ambiguo" da uno dei file di intestazione CppUnit. Sembra che sia istanziare la struct assertion_traits con il mio tipo, e che ha un metodo struct toString() che funziona utilizzando operator<< su un OStringStream.

assumo è ambigua invece di un errore a causa delle varie conversioni disponibili sul SCriterionVal, alcuni dei quali sono definiti operator<< (come il costruito in tipi). Nel tentativo di porre rimedio a questa situazione, ho creato una funzione non membro nell'intestazione per SCriterionVal con questa firma:

ostream &operator<<(ostream &stream, SCriterionVal val);

Ho capito perché la firma dovrebbe essere una corrispondenza esatta, si risolverà l'ambiguità. Non molta fortuna. Che cosa sto facendo male qui? Suppongo di poter specializzare il modello per assertion_traits per il mio tipo, ma speravo di essere in grado di risolvere il problema più generale di fornire un modo per mettere la mia classe in un flusso, e non solo di catering per il quadro di prova.

È stato utile?

Soluzione

Prova definire operator<< in funzione amico inline all'interno della definizione di classe. Ho sempre trovato in questo modo funziona meglio, in particolare per i modelli.

Per esempio, Boost.Random definisce operator<< all'interno dichiarazione del exponential distribution:

  template<class CharT, class Traits>
  friend std::basic_ostream<CharT,Traits>&
  operator<<(std::basic_ostream<CharT,Traits>& os, const exponential_distribution& ed)
  {
    os << ed._lambda;
    return os;
  }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top