0

Boost.Serialization のカスタムで軽量な適応を作成するために、これまでにいくつかのことを試しました。次のスタブが与えられます。

template<typename Archive>
class BasicStream {
public:
    template<typename Any>
    Archive& operator&(Any& data) {
        return Serialize(*this, data);
    }
};

一般に、ほとんどすべてのデータ型はグローバルSerialize関数の呼び出しによって正しく処理されますが、いくつかの例外があります。一部のデータ型については、指定された .xml に基づいて異なる方法で処理したいと考えていますArchive。書いてみた

class OutputStream : public BasicStream<OutputStream> {
public:
    template<>
    OutputStream& operator&(MyExceptionalType& data) {
        // ... do something super special ... //
        return *this;
    }
};

ただし、エラーが発生しますIntelliSense: declaration is incompatible with function template "OutputStream &BasicStream<Archive>::operator&(Any &data) [with Archive=OutputStream]"operator&の一般的なバージョンを継承し、派生クラスに特化しようとするこの試みの何が問題なのですか?

4

1 に答える 1

1

あなたはこのようにそれを行うことができます:

template<typename Archive>
class BasicStream {
public:
    template<typename Any>
    Archive& operator&(Any& data);
};

// generic implementation
template<typename Archive>
template<typename Any>
Archive& BasicStream<Archive>::operator&(Any& data) {
    return Serialize(*this, data);
}

class OutputStream : public BasicStream<OutputStream> {
};

// Specialize the original template, don't overwrite it
template<>
template<>
OutputStream& BasicStream<OutputStream>::operator&(MyExceptionalType& data) {
    // ... do something super special ... //
    return static_cast<OutputStream&>(*this);
}
于 2013-03-19T15:48:27.807 に答える