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ファイルの先頭に配置し、プロジェクト全体のassertation_traits特殊化を含むマスターヘッダーファイルに配置しました。たとえば、RWCString用の特殊化は問題なく機能します。どういうわけか、テストケースが失敗するたびに、浮動小数点値(おそらくdouble、doubleの特殊化がCPPUnitに組み込まれている)として時間を出力するように要求されます-これが、to/fromを含めるようにした理由です上記の最小化されたコードの二重変換演算子。

私がしていることに本質的に何か問題がありますか?特殊化は、コンパイルプロセスの特定の時点で存在する必要がありますか?おそらく、その時点を見つけられなかったのでしょうか?この神話上のポイントは、翻訳単位ごとですか、それともプロジェクトごとですか?VS2008を使用しています。

4

1 に答える 1

0

ここでの問題は、C++ の型の一致です。

元のタイプはおそらくconst STimeStamp&. ほとんどのコンパイラから来るとき、コピーを作成するよりconst T&も暗黙のキャスト演算子(あなたの場合)を好みます。doubleT

これはコンパイラ固有のものかもしれません...

于 2010-02-22T16:50:42.850 に答える