специализация шаблона для CPPUnit не используется - PullRequest
1 голос
/ 22 февраля 2010

Если вы уже использовали CPPUnit, вы, вероятно, знаете о его классе assertion_traits, который шаблонизирован для обработки произвольных типов. Это то, что позволяет ему печатать «фактические» и «ожидаемые» значения для нестроковых типов при неудачных тестовых случаях. Я использовал это с успехом несколько раз, но для одного конкретного типа это не работает для меня. Вот частичное объявление для моего класса, класса его родителя и некоторых операторов, не являющихся членами (все это огромно, плюс моя компания не позволит мне опубликовать его):

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;
};

А вот моя попытка специализировать класс утверждений 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();
    }
};

Я пробовал передавать его по значению, как показано выше, также передавая константные ссылки, я пытался привести значения внутри функций к HWDBDateTime (поскольку здесь определены операторы и asString() методы), кажется, ничего не помогает. Я поместил его в верхнюю часть файла CPP моего набора тестов и поместил в главный заголовочный файл, содержащий специализации assertion_traits для всего проекта, например, для RWCString, который работает безупречно. Почему-то всякий раз, когда тестовый случай терпит неудачу, он настаивает на распечатке моего времени в виде значения с плавающей запятой (предположительно, двойного; специализация для двойного встраивается в CPPUnit) - вот почему я обязательно включил мой to / from операторы двойного преобразования в свернутом коде выше.

Что-то не так с тем, что я делаю? Должна ли специализация присутствовать в определенной точке процесса компиляции, и, может быть, я просто не нашел эту точку? Будет ли эта мифическая точка для каждой единицы перевода или проекта? Я использую VS2008.

1 Ответ

0 голосов
/ 22 февраля 2010

C ++ соответствия типов является проблемой здесь.

Исходный тип, вероятно, const STimeStamp&. Если исходить из const T&, большинство компиляторов предпочитают неявные операторы приведения (в вашем случае double) вместо создания копии T.

Это может зависеть от компилятора ...

...