2016-05-21 32 views
1

私はテンプレートの関数を間違って の初期化について似たような質問がありましたが、私は何をしているのかを表示していません。 が間違っています。テンプレートの引数がありません

私は、boost::multiarrayboost::any要素をシリアル化するいくつかのテンプレート関数を記述しようとしています。

save_multi_array

template<class Archive , typename T , std::size_t K> 
inline void save_multi_array(Archive &ar , const boost::multi_array<T , K> &t , 
     const unsigned int file_version) 
{ 
typedef boost::multi_array<T , K> multi_array_; 
typedef typename multi_array_::size_type size_; 

    for(int k = 0 ; k < K ; ++k) { 
    size_ nk = (t.shape()[ k ]); 
    ar << BOOST_SERIALIZATION_NVP(nk); 
    } 
    ar << boost::serialization::make_array(t.data() , t.num_elements()); 
} 

load_multi_array:

template<class Archive , typename T , std::size_t K> 
inline void load_multi_array(Archive &ar, boost::multi_array<T , K> &t , 
     const unsigned int file_version) 

    { 
    typedef boost::multi_array<T , K> multi_array_; 
    typedef typename multi_array_::size_type size_; 

    boost::array<size_ , K> extents; 
    for(int k = 0 ; k < K ; ++k) 
    ar >> BOOST_SERIALIZATION_NVP(extents[ k ]); 

    t.resize(extents); 
    ar >> make_array(t.data() , t.num_elements()); 
    } 

がserialize_array:

私は、次のボディを持っている multiarrayテンプレート メソッドを呼び出すしようとすると、私の問題が発生します
template<class Archive , typename T , int K> 
inline void serialize(Archive &ar , boost::multi_array<T , K> &t , 
        const unsigned int file_version) 
    { 
    split_free(ar , t , file_version); 
    } 

main.cppの中でこのメソッドを使用すると、テンプレートメソッドの本体の中でそれらを呼び出そうとしたときに、boost::anyのためにロードして保存すると問題が発生します。ここでboost::any部分のテンプレートメソッドは、次のとおりです。

save_any:

template<class T> struct un_any_type {}; 
template<std::size_t K> struct un_any_int {}; 

template<class Archive, typename T, std::size_t K> 
inline void save_any (Archive & ar, un_any_type<T>, un_any_int<K> , std::vector<boost::any>::const_iterator &it, const unsigned int file_version) 
{ 

    if(K == 0){ 
    if (it->type() ==typeid(T)) { //case of saving an object 

    const std::type_info & ti = it->type(); 
    std::string a = ti.name(); 
    ar << BOOST_SERIALIZATION_NVP(a); 
    auto var = boost::any_cast<T>(*it); 
    ar << (var); 
    }//if 

     if (it->type() ==typeid(T *)) { //case of saving a pointer of an object 
     const std::type_info & ti = it->type(); 
     std::string a = ti.name(); 
     ar << BOOST_SERIALIZATION_NVP(a); 
     auto var = boost::any_cast< T * >(*it); 
     ar << (*var); 
     }//if 
}//if for K-dim 
else{ 

    if (it->type() ==typeid(boost::multi_array< T , K >)) { //case of saving a multi-dim array 
       const std::type_info & ti = it->type(); 
       std::string a = ti.name(); 
       ar << BOOST_SERIALIZATION_NVP(a); 
       /*auto*/ boost::multi_array<T , K> var = boost::any_cast< boost::multi_array<T , K> >(*it); 
       save_multi_array (ar , var , version); 
      }//if 

}//if for K-dim 
} 

load_any:私は私が受け取るこれらのメソッドの内部load_multi_arraysave_multi_arrayを呼び出すしよう

template<class Archive, typename T, std::size_t K> 
inline void load_any (Archive & ar, un_any_type<T>, un_any_int<K> , std::vector<boost::any>::iterator it, const unsigned int file_version) 
{ 

    if(K == 0){ // case we deal with object, pointer of object, etc 

    T var; 
     ar >> (var); 
    *it = var; 
    }//if for K-dim 
    else{ 

     if (it->type() ==typeid(boost::multi_array< T , K >)) { //case of saving a multi-dim array 
     typedef boost::multi_array<T , K> array_type; 
     array_type var; 
     load_multi_array(ar, var, version); 
    }//if 

}//if for K-dim 
} 

エラー:

missing template arguments before ‘)’ token 

****提案されたコメントに基づいて編集:

まずはご関心をお寄せいただきありがとうございます。ここではまず は、私が現在実行しているコードで、 main.cppには、このリンクで見つけることができます:

https://gist.github.com/anonymous/0464563914dd4b7508e54f199187d4f4

そして、私はテンプレート関数を書いたヘッダファイルは、ここで見つけることができます:

を は

https://gist.github.com/anonymous/0f19fdd16100c18244f90f488669640a

あなたは上記のリンクで見ることができるコードのビット更なる説明は、 main.cppには、まず、すべての適切ないくつかが不要であり、それの後に、私はクラスのGPSを初期化し、おそらく(含まれてい_position where シリアライズをチェックしたいいくつかのタイプの要素が含まれています。 難しいのはboost :: multi配列とboost ::に関するものです。ヘッダファイルに含まれるメソッド)。 あなたが見ることができるように、boost :: anyベクトルのためにsaveメソッドがベクトルのサイズとブーストに含まれるすべての異なる型を保存して渡すために、loadとsaveの2つのメソッドがあります::任意のベクトル。 したがって、各if_caseは、boost :: anyの内部に存在すると予想される他の型を参照し、それぞれに対してboost :: anyベクトルに要素を適切に保存またはロードするための対応するsave_anyまたはload_anyテンプレートメソッドを呼び出します。ラインなしで

: 今、問題自体はsave_any & load_anyのテンプレートメソッドの内部で、私はより具体的に、ヘッダー・ファイル内のテンプレートメソッド内の対応save_multi_array & load_multi_arrayを呼び出すという事実にあります。 88
save_multi_array(ar、var、version);

ライン番号。 109: load_multi_array(ar、var、version);

テンプレート引数の欠落に関する上記のエラーが発生しました。最後に何をコンソールに印刷されては、以下のものです:

../src/Multi_Array_Serialization.hpp: In function ‘void boost::serialization::save_any(Archive&, boost::serialization::un_any_type<T>, boost::serialization::un_any_int<K>, std::vector<boost::any>::const_iterator&, unsigned int)’: 
    ../src/Multi_Array_Serialization.hpp:88:46: error: missing template arguments before ‘)’ token save_multi_array (ar , var , version); 
                           ^
    ../src/Multi_Array_Serialization.hpp: In function ‘void boost::serialization::load_any(Archive&, boost::serialization::un_any_type<T>, boost::serialization::un_any_int<K>, std::vector<boost::any>::iterator, unsigned int)’: 
    ../src/Multi_Array_Serialization.hpp:109:37: error: missing template arguments before ‘)’ token load_multi_array(ar, var, version); 
           ^

は、最後にメインの本体に、私はちょうど私は、彼らが正しくシリアル化されているかどうかを確認するオブジェクトなどのいくつかの異なるタイプを初期化して使用することに注意してください! これは私の正確な問題です。詳細については、対応するsave_anyとload_anyテンプレートメソッドのsave_multi_arrayメソッドとload_multi_arrayメソッドをsthに変更する必要があることを認識しています。何。私は本当にこの問題を解決する方法に関する提案を感謝します!

+1

行番号などの完全なエラーメッセージを表示して、コード内でその行がどこにあるかを示すヒントを提供したり、エラーを再現するために使用できる最小限の完全で検証可能な例を作成してください://stackoverflow.com/help/mcve)。 – mars

+0

私は質問のアップグレード版がより適切に物事を理解するのに役立つことを願っています!他に何かが必要な場合は、私に知らせてください。 – user3111197

答えて

2

load_any機能とsave_any機能の両方でタイプミスがあります。整数file_versionload_multi_arraysave_multi_arrayに渡しますが、versionと書いてください。コンパイラは、その後、あなたがエラーメッセージを取得する理由です、テンプレートは、テンプレート引数を必要としないこと

template <class T> struct boost::serialization::version; 

を参照していると思います。

関連する問題