Google Test E aspettaria e boost :: make_recursive_variant
-
12-11-2019 - |
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 '
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.