0

到目前为止,为了创建 Boost.Serialization 的自定义和轻量级改编,我尝试了一些事情。给出以下存根:

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

通常,调用全局Serialize函数可以正确处理几乎所有数据类型,但也有一些例外。对于某些数据类型,我想根据指定的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 回答