繁体   English   中英

没有使用CPPUnit的模板专业化

[英]template specialization for CPPUnit isn't being used

如果以前使用过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 (因为已定义了operator和asString()方法的位置),似乎没有任何帮助。 我将其放在测试套件的CPP文件的顶部,并将其放入一个主标头文件,该标头文件包含项目范围内的assertion_traits专长,例如RWCString可以完美运行。 不知何故,每当一个测试用例失败时,它都会坚持将我的时间打印为浮点值(大概是double值; CPPUnit内置了double的特殊化)-这就是为什么我确保将to / from包括在内以上最小化代码中的double转换运算符。

我在做什么,天生就有问题吗? 专业化是否需要在编译过程中的某个时刻出现,也许我还没有找到? 这个神话要点是每个翻译单位还是每个项目? 我正在使用VS2008。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM