代码之家  ›  专栏  ›  技术社区  ›  rmeador

未使用CPP单元的模板专门化

  •  1
  • rmeador  · 技术社区  · 15 年前

    如果你以前用过CPP,你可能知道它 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;
    };
    

    下面是我的专业化CPP单元断言类的尝试:

    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文件的顶部,并把它放在一个包含项目范围断言特性专门化的主头文件中,比如一个用于rwcstring的文件,它可以完美地工作。不知怎么的,每当一个测试用例失败时,它坚持将我的时间打印为一个浮点值(大概是一个双精度值;在cppUnit中内置了双精度值的专门化)——这就是为什么我确保在上面的最小化代码中包含我的到/从双精度转换操作符的原因。

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

    1 回复  |  直到 15 年前
        1
  •  0
  •   rioki    15 年前

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

    原始类型可能是 const STimeStamp& . 当来自 const T& 大多数编译器更喜欢隐式强制转换运算符(在您的情况下 double )过度创建副本 T .

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