2017-07-19 3 views
3

に従いますC++数学ライブラリEigen3を使用するC++ライブラリをコンパイルしています。 VC2013でコンパイルするときただし、以下のコードは、いくつかの構文エラーを導入:C++クラスはテンプレートキーワード

template <typename Derived> 
    inline Eigen::Transform<typename Derived::Scalar, 3, Eigen::Isometry> v2t(const Eigen::MatrixBase<Derived>& x_) { 
    Eigen::Transform<typename Derived::Scalar, 3, Eigen::Isometry> X; 
    Eigen::Matrix<typename Derived::Scalar, 6, 1> x(x_); 
    X.template linear() = quat2mat(x.template block<3,1>(3,0)); 
    X.template translation() = x.template block<3,1>(0,0); 
    return X; 
    } 

次のようなエラーメッセージは次のとおりです。

Error C2059 syntax error : 'template'  
Error C2039 'X' : is not a member of 'Eigen::Transform<float,3,1,0>'   
Error C2059 syntax error : 'template'  
Error C2039 'X' : is not a member of 'Eigen::Transform<float,3,1,0>'  

私はそのX.templateのようなコードを見たことがないので、私はどのように私は考えていますこのコンパイルエラーを修正することができます。何か案は?

+2

あなたはどのバージョンのEigenを使用していますか?私は最新のコピーをつかんで、そのコードを見つけることができませんでした...そのコードは、あなたがコンパイルしているライブラリで、それは次にEigenを参照していますか? 'X.template linear()'は 'X.template linear ()'または単に 'X.linear()'のようなものでなければなりません。 – txtechhelp

+0

@txtechhelp私はEigenをコンパイルしていません。 Eigenを使用しています。http://jacoposerafin.com/nicp/ – feelfree

+0

'X.template'と' x.template'は有効ではありません。C++;それらの表現が意味するものは何ですか? –

答えて

3

templateキーワードは、例えば、テンプレートと比較演算子の間で明確にするために、ここで使用されるべきです。:

ここ
struct X { 
    template <int A> 
    void f(); 
}; 

template <class T> 
void g() { 
    T t{}; 
    t.f<4>(); // Error - Do you want to compare t.f with 4 
       // or do you want to call the template t.f ? 
} 

あなたは「明確」にt.template f<4>()を必要としています。あなたが使ったライブラリの問題は、Eigen::Transform<...>::linearがテンプレートメンバ関数ではないので、templateキーワードはここでは必要ではないので、使用しないでください(私は思う)。

[temps.name#5]

キーワードtemplateで始まる名前は、テンプレートIDまたは名前がクラステンプレートを参照するものでなければなりません。 [注:キーワードtemplateは、クラステンプレートのテンプレート以外のメンバーには適用されない可能性があります。末端 ノート] [...]

MSVCが正しいと、Eigen::Transform<...>::linearはクラステンプレートの非テンプレートメンバーなので、templateキーワードが適用されるべきではありません。標準からの次の例では、病気に形成されたことが、gccと打ち鳴らすと完璧にうまくコンパイルする必要があります

template <class T> struct A { 
    void f(int); 
    template <class U> void f(U); 
}; 

template <class T> void f(T t) { 
    A<T> a; 
    a.template f<>(t); // OK: calls template 
    a.template f(t); // error: not a template-id 
} 

あなたはgithubに使うライブラリについてこのことについて未解決の問題がすでに存在しているが、著者からの任意の回答なし...ヘッダ(ncip/bm_se3.h)を自分で更新したり、プロジェクトをフォークしたり、githubでpull-requestを行ったりできます。