Boost - класс не имеет члена с именем 'serialize' (абстрактный класс)? - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь сериализовать свой абстрактный класс в соответствии с этими вопросами:

My neuron.h выглядит следующим образом:

class Neuron {

public:

    struct access;

    API virtual ~Neuron();

    API virtual double activate( double x, double b ) = 0;

};

Мне нужно сохранить все Boost связанные элементы в neuron.cpp, чтобы предотвратить включение заголовков Boost при использовании neuron.h в некоторых других кодах.

My neuron.cpp выглядит следующим образом:

#include "Neuron.h"

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

BOOST_SERIALIZATION_ASSUME_ABSTRACT(Neuron);

struct Neuron :: access {
    template <class Archive>
    static void serialize(Archive &ar, Neuron& n, const unsigned int version) {}
};

namespace boost {
    namespace serialization {

        template<class Archive>
        void serialize(Archive & ar, Neuron& n, const unsigned int version)
        {
            Neuron::access::serialize(ar, n, version);
        }

    } // namespace serialization
} // namespace boost

Neuron::~Neuron() {

}

Проблема в том, что когда я использую его унаследованные классы в другом месте, я получаю сообщение об ошибке

***/boost/boost/serialization/access.hpp:116:11: error: ‘class Neuron’ has no member named ‘serialize’

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 16 сентября 2018

Я думаю, что ключ здесь "когда я использую его унаследованные классы в другом месте" .Исправьте меня (и ваш вопрос, пожалуйста), если я ошибаюсь, но это говорит о том, что вы получаете ошибку компиляции при компиляции исходного файла, отличного от neuron.cpp.

Это имеет смысл, учитывая, какой компилятордолжен работать с.Вы могли заметить, что изменения в одном исходном файле не требуют повторной компиляции других исходных файлов.Таким образом, добавление чего-либо - например, перегрузки serialize() - в neuron.cpp не меняет компиляцию других модулей перевода.(Это может изменить то, как все соединено вместе в конце, но мы еще не там.) Если другой модуль перевода попытается сериализовать Neuron, материал в neuron.cpp не имеет значения.Компилятор не знает о соответствующей перегрузке serialize(), поэтому сериализация Neuron в другом исходном файле приводит к навязчивой сериализации.То есть компилятор будет искать функцию-член Neuron с именем serialize().

Чтобы ваша перегрузка serialize() влияла на компиляцию других модулей перевода, она должнабыть объявленным в заголовочном файле.

Поскольку вы не можете поместить Boost в neuron.h, возможно, вам придется создать новый заголовочный файл, скажем, neuron_boost.h.Этот файл #include "neuron.h" затем предоставит объявления, необходимые для сериализации Boost.Исходные файлы, которые сериализуют потомков Neuron, будут включать neuron_boost.h, в то время как другие исходные файлы могут продолжать включать исходные neuron.h.

...