Ненавязчивый метод сериализации для класса шаблона

Я использую ускоренную сериализацию, в основном навязчивую версию. Для шаблонного класса 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>]'

person Philipp    schedule 29.03.2011    source источник
comment
Как вы вызываете метод сериализации?   -  person Jonas Bötel    schedule 29.03.2011
comment
boost называет это, пожалуйста, смотрите мои правки.   -  person Philipp    schedule 29.03.2011


Ответы (1)


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

person Tim Sylvester    schedule 31.03.2011