gpt4 book ai didi

C++ 类后跟模板关键字

转载 作者:太空狗 更新时间:2023-10-29 21:13:11 34 4
gpt4 key购买 nike

我正在编译一个使用 C++ 数学库 Eigen3 的 C++ 库。但是,以下代码在使用 VC2013 编译时会引入一些语法错误:

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 这样的代码,所以我不知道如何才能更正此编译错误。有任何想法吗?

最佳答案

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]

A name prefixed by the keyword template shall be a template-id or the name shall refer to a class template. [ Note: The keyword template may not be applied to non-template members of class templates. —end note ] [...]

MSVC 是对的,Eigen::Transform<...>::linear是类模板的非模板成员,所以 template不应应用关键字。标准中的以下示例格式不正确,但使用 gcc 和 clang 编译得很好:

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 上使用的库,已经有一个 Unresolved 问题,但作者没有给出任何答案...您可以自己更新 header ( ncip/bm_se3.h ) 或 fork 该项目并在 github 上提出拉取请求。

关于C++ 类后跟模板关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45183619/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com