Domanda

Se avete già utilizzato CppUnit prima, si sono probabilmente consapevoli della sua classe assertion_traits che è templatized per gestire i tipi arbitrari. Questo è ciò che permette di stampare i valori e le "reali" "attesi" per i tipi non-stringa quando casi di test sicuro. Ho usato questo con successo diverse volte, ma per un tipo specifico che non funziona per me. Ecco una dichiarazione di parziale per la mia classe, la classe di suo genitore, e alcuni operatori terzi (il tutto è enorme, più la mia azienda non mi permette di post-it):

class _declspec(dllexport) HWDBDateTime
{
public:
    HWDBDateTime();
    HWDBDateTime(const HWDBDateTime& other);

    HWDBDateTime& operator=(const HWDBDateTime& other);

    RWCString asString() const;
    RWCString asString(const char *format, const boost::local_time::time_zone_ptr pZone = STimeZone::GetServerTimeZone()) const;
};

bool _declspec(dllexport) operator==(const HWDBDateTime& dt1, const HWDBDateTime& dt2);
bool _declspec(dllexport) operator!=(const HWDBDateTime& dt1, const HWDBDateTime& dt2);
bool _declspec(dllexport) operator< (const HWDBDateTime& dt1, const HWDBDateTime& dt2);
bool _declspec(dllexport) operator<=(const HWDBDateTime& dt1, const HWDBDateTime& dt2);
bool _declspec(dllexport) operator> (const HWDBDateTime& dt1, const HWDBDateTime& dt2);
bool _declspec(dllexport) operator>=(const HWDBDateTime& dt1, const HWDBDateTime& dt2);

class _declspec(dllexport) STimeStamp : public HWDBDateTime
{
public:

    STimeStamp();

    STimeStamp(const STimeStamp& other);

    STimeStamp(const HWDBDateTime& other);

    explicit STimeStamp(double d);

    STimeStamp& operator=(double d);

    operator double() const;
};

E qui è il mio tentativo di specializzazione della classe affermazioni CppUnit:

template <>
struct CppUnit::assertion_traits<STimeStamp>
{  
    static bool equal( STimeStamp x, STimeStamp y )
    {
        return x == y;
    }

    static std::string toString( STimeStamp x )
    {
        return (const char *)x.asString();
    }
};

Lo ho provato passaggio per valore, come visto sopra, passando anche riferimenti const, ho provato gettando i valori all'interno delle funzioni di HWDBDateTime (dato che è dove gli operatori ed i metodi asString() sono definiti), nulla sembra aiutare . Ho messo nella parte superiore del file di CPP di mia suite di test, e l'ho messo in un file di intestazione master che contiene assertion_traits specializzazioni a livello di progetto, come ad esempio uno per RWCString che funziona perfettamente. In qualche modo, ogni volta che un banco di prova non riesce, insiste sulla stampa il mio tempo come un valore in virgola mobile (presumibilmente una doppia, una specializzazione per il doppio è costruito per CppUnit) - questo è il motivo per cui ho fatto in modo di includere il mio da / operatori doppia conversione nel codice minimizzato sopra.

C'è qualcosa di intrinsecamente sbagliato in quello che sto facendo? Fa la specializzazione ha bisogno di essere presente a un certo punto del processo di compilazione, e forse sono io che non ho trovato quel punto? Sarebbe questo punto mitica essere per-translation-unità o per-progetto? Sto usando VS2008.

È stato utile?

Soluzione

Tipo C ++ di corrispondenza è il problema qui.

Il tipo di originale è probabilmente const STimeStamp&. Arrivando da const T& maggior parte dei compilatori preferisce gli operatori del cast impliciti (nel tuo caso double) sopra la creazione di una T copia.

Questo può essere specifica del compilatore ...

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