未使用CPPUnit的模板专门化

时间:2010-02-22 15:56:56

标签: c++ templates cppunit template-specialization

如果你以前使用过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内置了double的专门化) - 这就是为什么我确保包括我的/来自上面最小化代码中的双转换运算符。

我正在做的事情本身有什么问题吗?专业化是否需要在编译过程中的某一点出现,也许我只是没有找到这一点?这个神秘的观点是翻译单元还是每个项目?我正在使用VS2008。

1 个答案:

答案 0 :(得分:0)

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

原始类型可能是const STimeStamp&。来自const T&时,大多数编译器都倾向于使用隐式强制转换运算符(在您的情况下为double)而不是创建副本T

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