gpt4 book ai didi

c++ - 未使用 CPPUnit 的模板特化

转载 作者:太空宇宙 更新时间:2023-11-04 14:27:54 24 4
gpt4 key购买 nike

如果您以前使用过 CPPUnit,您可能知道它的 assertion_traits 类被模板化以处理任意类型。这就是允许它在测试用例失败时打印非字符串类型的“实际”和“预期”值的原因。我已经成功使用过几次,但对于一种特定类型,它对我不起作用。这是我的类(class),它的父类(class)和一些非成员(member)运营商的部分声明(整个东西很大,而且我的公司不让我发布):

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。不知何故,每当测试用例失败时,它坚持将我的时间打印为浮点值(大概是 double ;CPPUnit 内置了 double 的专门化)——这就是为什么我确保包含我的 to/from上面最小化代码中的双重转换运算符。

我正在做的事情有什么内在的错误吗?特化是否需要在编译过程的某个时刻出现,也许我只是没有找到那个时刻?这个神话点是按翻译单元还是按项目?我正在使用 VS2008。

最佳答案

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

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

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

关于c++ - 未使用 CPPUnit 的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2312106/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com