Esistono tre modi per identificare il problema con operator<<
.
Il primo modo è fornire un operator<<
per il proprio tipo. Ciò è necessario perché quando lo boost_check_equal
non riesce, registra anche l'errore chiamando operator<<
con gli oggetti. Vedere l'appendice dettagliato dopo l'interruzione per vedere come questo è effettivamente realizzato. È più difficile di quanto possa sembrare.
Il secondo modo è di non eseguire la registrazione che ho appena menzionato. È possibile farlo da #definine
ing BOOST_TEST_DONT_PRINT_LOG_VALUE
. Per disattivare la registrazione per un solo esame, si potrebbe circondare la prova in questione con questo #define
, allora #undef
immediatamente:
#define BOOST_TEST_DONT_PRINT_LOG_VALUE
BOOST_CHECK_EQUAL (first, second);
#undef BOOST_TEST_DONT_PRINT_LOG_VALUE
Il terzo modo è quello di eludere la necessità di un operator<<
che funziona con il tipo, non confrontando un elemento ad un altro, ma solo controllando un bool:
BOOST_CHECK (first == second);
selezionare il metodo preferito.
La mia preferenza è la prima, ma l'implementazione è sorprendentemente impegnativa. Se si definisce semplicemente uno operator<<
nell'ambito globale, non funzionerà. Penso che la ragione di ciò sia a causa di un problema con la risoluzione dei nomi. Un suggerimento popolare per risolvere questo problema è quello di inserire lo operator<<
nello spazio dei nomi std
. Questo funziona, almeno in pratica su alcuni compilatori, ma non mi piace perché lo standard proibisce di aggiungere qualcosa allo spazio dei nomi std
.
Un metodo migliore che ho trovato è quello di implementare una specializzazione di modello di classe print_log_value
personalizzata per il tipo. print_log_value
è un modello di classe useb dagli interni di Boost.Test per chiamare effettivamente il operator<<
corretto per il tipo specificato. Delega a un operator<<
per fare il sollevamento pesi. Specializzare print_log_value
per i tuoi tipi personalizzati è ufficialmente supportato da Boost [citazione necessaria], ed è realizzato in tal modo.
Assumendo che il tipo è chiamato Timestamp
(è nel mio codice), in primo luogo definire un libero operator<<
globale per Timestamp
:
static inline std::ostream& operator<< (std::ostream& os, const Mdi::Timestamp& ts)
{
os << "Timestamp";
return os;
}
...e quindi fornire il print_log_value
specializzazione per esso, delegando al operator<<
appena definito:
namespace boost { namespace test_tools {
template<>
struct print_log_value<Mdi::Timestamp > {
void operator()(std::ostream& os,
Mdi::Timestamp const& ts)
{
::operator<<(os,ts);
}
};
}}
Quali sono stati gli errori? – Dennis
Non si compila ... E sto lavorando in Codeblocks, quindi non posso copiare e incollare gli errori. E tutti sono nel file test_tools.hpp e non capisco veramente di cosa si tratti (ho menzionato il primo nel post). Dovrei dare più esempi? – Ioana
Ho compilato con gcc e vorrei incollare gli errori ma è troppo lungo 11400 caratteri per un commento. – Ioana