1

如果您以前使用过 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();
    }
};

我已经尝试过按值传递,如上所示,也传递 const 引用,我尝试将函数内的值强制转换为HWDBDateTime(因为这asString()是定义运算符和方法的地方),似乎没有任何帮助。我把它放在了我的测试套件的 CPP 文件的顶部,我把它放到了一个包含项目范围内的 assertion_traits 特化的主头文件中,例如完美运行的 RWCString 的一个。不知何故,每当测试用例失败时,它都会坚持将我的时间打印为浮点值(大概是双精度;CPPUnit 内置了双精度的特化)——这就是为什么我确保包含我的 to/from上面最小化代码中的双重转换运算符。

我正在做的事情本质上是错误的吗?专业化是否需要在编译过程中的某个点出现,也许我只是没有找到那个点?这个神话点是每个翻译单元还是每个项目?我正在使用VS2008。

4

1 回答 1

0

C++ 类型匹配是这里的问题。

原来的类型大概是const STimeStamp&。当来自const T&大多数编译器时,更喜欢隐式转换运算符(在您的情况下double)而不是创建副本T

这可能是编译器特定的......

于 2010-02-22T16:50:42.850 回答