2

私はブーストシリアライゼーションを使用していますが、ほとんどが侵入型です。テンプレート 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 Rint Cは行と列、またはElementTypeです。doublefloat

ただし、これは 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>]'
4

1 に答える 1

1

私には符号付き/符号なしの不一致のように見えます。テンプレート関数はintsで宣言されていますが、エラーは、テンプレートと照合しようとしているオブジェクトにパラメーター1uとが含まれていることを示しています3u。シリアル化しようとしているオブジェクトをインスタンス化するとき、ディメンションに符号なしの値を使用していますか?テンプレートのシリアル化関数をunsignedsに変更するか、マトリックスをintsでインスタンス化してみてください。

于 2011-03-31T01:06:59.970 に答える