Ненавязчивый метод сериализации для класса шаблона - PullRequest
2 голосов
/ 29 марта 2011

Я использую сериализацию boost, в основном навязчивую версию. Для шаблонного класса Matrix я хотел бы иметь ненавязчивую версию , которая работает в Visual Studio со следующим кодом:

namespace boost 
{
    namespace serialization 
    {

        template<class Archive, int R, int C, class ElementType>
        void serialize(Archive & ar, Matrix<R, C, ElementType> & m, const unsigned int version)
        {
            ar & ...
        }

    } 
}

int R, int C - строка и столбцы, ElementType - double или float.

Однако это не работает в GCC 4.3.2 с ошибкой

error: 'class Matrix<1u, 3u, double>' has no member named 'serialize'

Если я использую специальную форму, такую ​​как

namespace boost 
{
    namespace serialization 
    {

        template<class Archive>
        void serialize(Archive & ar, Matrix<3,1,double> & m, const unsigned int version)
        {
            ar & ...
        }

    } 
}

он компилируется в GCC, но, конечно, только для специального набора аргументов шаблона.

Что я могу сделать, чтобы он работал на обоих компиляторах для всех R, C и ElementType?

РЕДАКТИРОВАТЬ: это строки, вызывающие ошибку:

/[myfolder]/lib/BOOST/1_44_0/include/boost/serialization/access.hpp: In static member function 'static void boost::serialization::access::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::binary_iarchive, T = Matrix<3u, 1u, double>]':
/[myfolder]/lib/BOOST/1_44_0/include/boost/serialization/serialization.hpp:70: instantiated from 'void boost::serialization::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::binary_iarchive, T = Matrix<3u, 1u, double>]'
/[myfolder]/lib/BOOST/1_44_0/include/boost/serialization/serialization.hpp:129: instantiated from 'void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::archive::binary_iarchive, T = Matrix<3u, 1u, double>]'
/[myfolder]/lib/BOOST/1_44_0/include/boost/archive/detail/iserializer.hpp:182: instantiated from 'void boost::archive::detail::iserializer<Archive, T>::load_object_data(boost::archive::detail::basic_iarchive&, void*, unsigned int) const [with Archive = boost::archive::binary_iarchive, T = Matrix<3u, 1u, double>]'

1 Ответ

1 голос
/ 31 марта 2011

Это выглядит как несоответствие со знаком / без знака для меня.Ваша шаблонная функция объявлена ​​с int s, но ошибка указывает, что объект, который пытается сопоставить с шаблоном, имеет параметры 1u и 3u.Когда вы создаете экземпляр объекта, который пытаетесь сериализовать, используете ли вы беззнаковые значения для измерений?Попробуйте изменить функцию шаблона сериализации на unsigned с или создать экземпляр матрицы с int с.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...