Domanda

Ho una variante ricorsiva Boost come di seguito. Quando confronto due oggetti varianti ricorsivi usando Assert, funziona bene ma con aspettative, fornisce un errore di compilazione.

typedef boost::make_recursive_variant<bool, boost::uint8_t, boost::uint32_t,
    boost::int32_t, double, std::string, boost::uuids::uuid>::type rvariant_type;

variant_type b1 = true;
rvariant_type b2 = true;

assert(b1 == b2);  //work fine

EXPECT_EQ(b1,b2); //gives compiler error.
EXPECT_EQ(boost::get<bool>(b1), boost::get<bool>(b2)); //works fine

boost/v1.46.1/include/boost/variante/dettaglio/variante_io.hpp: 64: errore: nessuna corrispondenza per 'operatore <<' in '((const boost :: dettagli :: variante :: stampa>>*) questo )-> boost :: dettaglio :: variante :: stampante>> :: out_ << operand '

È stato utile?

Soluzione

Gtest fa un uso intenso dei flussi per l'output, ma sembra che il supporto per la stampamento :: Boost :: Variant per la stampa tramite un operatore sovraccarico << sia molto limitato, se non inesistente.

Guarda questo:

#include <boost/variant.hpp>
#include <boost/cstdint.hpp>
#include <boost/uuid/uuid.hpp>
#include <iostream>
typedef boost::make_recursive_variant<bool, boost::uint8_t, boost::uint32_t,
    boost::int32_t, double, std::string, boost::uuids::uuid>::type rvariant_type;

int main() {
  rvariant_type v1 = true;
  std::cout << v1 << std::endl;
  return 0;
}

Questo programma molto breve fornisce lo stesso errore di compilazione che hai ricevuto da GTest.

Integrandolo con questo:

std::ostream& operator<<(std::ostream& out, const rvariant_type& p) {
  return out << boost::get<bool>(p);
}

Fa la compilazione del mio test, darò un'occhiata se riesco a far funzionare anche il tuo esempio.

AGGIORNARE: Ho appena compilato e eseguito con successo un test in base al tuo codice dopo aver inserito l'operatore sopra menzionato <<, quindi la mancanza di un operatore << è esattamente ciò che lo stava causando.

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