该代码在 Eigen 3.2 中有效,但在 Eigen 3.4 中失败。有谁知道原因?
以下代码可以在 Eigen 3.2 中编译成功: g++ -std=c++11 test.cpp -o test -isystem /eigen-3.2.1
#include <iostream>
#include <Eigen/Core>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
int main()
{
typedef Eigen::MatrixXcf CMatrix;
typedef Eigen::Array<CMatrix, Eigen::Dynamic, Eigen::Dynamic> CMMatrix;
CMMatrix a = CMMatrix::Constant(4, 4,CMatrix::Zero(3, 3));
CMMatrix b = CMMatrix::Constant(4, 4,CMatrix::Zero(3, 3));
CMMatrix c = a + b;
return 0;
}
但是当我在 Eigen 3.4 中编译上述代码时,却失败了: g++ -std =c++11 test.cpp -o test -isystem /eigen-3.4.0。错误信息是:
ambiguous overload for 'operator+' (operand types are 'CMMatrix {aka Eigen::Array<Eigen::Matrix<std::complex<float>, -1, -1>, -1, -1>}' and 'CMMatrix {aka Eigen::Array<Eigen::Matrix<std::complex<float>, -1, -1>, -1, -1>}')
CMMatrix c = a + b;
有人知道为什么吗?如何使用 Eigen 3.4 修复代码? 更重要的是,我将代码改成如下:
#include <iostream>
#include <Eigen/Core>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
int main()
{
typedef Eigen::MatrixXcf CMatrix;
typedef Eigen::Array<CMatrix, Eigen::Dynamic, Eigen::Dynamic> CMMatrix;
CMMatrix a = CMMatrix::Constant(4, 4,CMatrix::Zero(3, 3));
CMMatrix b = CMMatrix::Constant(4, 4,CMatrix::Zero(3, 3));
CMMatrix c = a;
c += b;
return 0;
}
令人惊讶的是,上面的代码竟然能够编译成功。原因是什么? 如何巧妙地使用 Eigen 3.4 修复代码,而不是“c=a,c+=b;”的方式。 多谢!
完整错误信息如下:
test_map.cpp:13:20: ambiguous overload for operator+ (operand types are CMMatrix {aka Eigen::Array<Eigen::Matrix<std::complex<float>, -1, -1>, -1, -1>} and CMMatrix {aka Eigen::Array<Eigen::Matrix<std::complex<float>, -1, -1>, -1, -1>})
CMMatrix c = a + b;
~~^~~
In file included from /eigen-3.4.0/Eigen/Core:19:0,
from test_map.cpp:2:
/eigen-3.4.0/Eigen/src/Core/../plugins/CommonCwiseBinaryOps.h:27:28: candidate: const Eigen::CwiseBinaryOp<Eigen::internal::scalar_sum_op<typename Eigen::internal::traits<T>::Scalar, typename Eigen::internal::traits<OtherDerived>::Scalar>, const Derived, const OtherDerived> Eigen::ArrayBase<Derived>::operator+(const Eigen::ArrayBase<OtherDerived>&) const [with OtherDerived = Eigen::Array<Eigen::Matrix<std::complex<float>, -1, -1>, -1, -1>; Derived = Eigen::Array<Eigen::Matrix<std::complex<float>, -1, -1>, -1, -1>; typename Eigen::internal::traits<OtherDerived>::Scalar = Eigen::Matrix<std::complex<float>, -1, -1>; typename Eigen::internal::traits<T>::Scalar = Eigen::Matrix<std::complex<float>, -1, -1>]
EIGEN_MAKE_CWISE_BINARY_OP(operator+,sum)
^
/eigen-3.4.0/Eigen/src/Core/util/Macros.h:1339:4: in definition of macro \u2018EIGEN_MAKE_CWISE_BINARY_OP
(METHOD)(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const \
^~~~~~
/eigen-3.4.0/Eigen/src/Core/../plugins/ArrayCwiseBinaryOps.h:241:29: candidate: const Eigen::CwiseBinaryOp<Eigen::internal::scalar_sum_op<typename Eigen::internal::traits<T>::Scalar, typename Eigen::internal::promote_scalar_arg<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::scalar_sum_op<typename Eigen::internal::traits<T>::Scalar, T> > >::value>::type>, const Derived, const typename Eigen::internal::plain_constant_type<Derived, typename Eigen::internal::promote_scalar_arg<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::scalar_sum_op<typename Eigen::internal::traits<T>::Scalar, T> > >::value>::type>::type> Eigen::ArrayBase<Derived>::operator+(const T&) const [with T = Eigen::Array<Eigen::Matrix<std::complex<float>, -1, -1>, -1, -1>; Derived = Eigen::Array<Eigen::Matrix<std::complex<float>, -1, -1>, -1, -1>; typename Eigen::internal::plain_constant_type<Derived, typename Eigen::internal::promote_scalar_arg<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::scalar_sum_op<typename Eigen::internal::traits<T>::Scalar, T> > >::value>::type>::type = Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<Eigen::Matrix<std::complex<float>, -1, -1> >, const Eigen::Array<Eigen::Matrix<std::complex<float>, -1, -1>, -1, -1> >; typename Eigen::internal::promote_scalar_arg<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::scalar_sum_op<typename Eigen::internal::traits<T>::Scalar, T> > >::value>::type = Eigen::Matrix<std::complex<float>, -1, -1>; typename Eigen::internal::traits<T>::Scalar = Eigen::Matrix<std::complex<float>, -1, -1>]
EIGEN_MAKE_SCALAR_BINARY_OP(operator+,sum)
^
/eigen-3.4.0/Eigen/src/Core/util/Macros.h:1365:4: in definition of macro EIGEN_MAKE_SCALAR_BINARY_OP_ONTHERIGHT
(METHOD)(const T& scalar) const { \
^~~~~~
/eigen-3.4.0/Eigen/src/Core/../plugins/ArrayCwiseBinaryOps.h:241:1: in expansion of macro \u2018EIGEN_MAKE_SCALAR_BINARY_OP
EIGEN_MAKE_SCALAR_BINARY_OP(operator+,sum)
the following code can be compiled successfuly by Eigen 3.2: g++ -std=c++11 test.cpp -o test -isystem /eigen-3.2.1
#include <iostream>
#include <Eigen/Core>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
int main()
{
typedef Eigen::MatrixXcf CMatrix;
typedef Eigen::Array<CMatrix, Eigen::Dynamic, Eigen::Dynamic> CMMatrix;
CMMatrix a = CMMatrix::Constant(4, 4,CMatrix::Zero(3, 3));
CMMatrix b = CMMatrix::Constant(4, 4,CMatrix::Zero(3, 3));
CMMatrix c = a + b;
return 0;
}
But when I compile the above code by Eigen 3.4, it failed: g++ -std=c++11 test.cpp -o test -isystem /eigen-3.4.0. And the error information is :
ambiguous overload for 'operator+' (operand types are 'CMMatrix {aka Eigen::Array<Eigen::Matrix<std::complex<float>, -1, -1>, -1, -1>}' and 'CMMatrix {aka Eigen::Array<Eigen::Matrix<std::complex<float>, -1, -1>, -1, -1>}')
CMMatrix c = a + b;
Anyone know why? How can I fix the code by using Eigen 3.4?
What's more, I change the code as follows:
#include <iostream>
#include <Eigen/Core>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
int main()
{
typedef Eigen::MatrixXcf CMatrix;
typedef Eigen::Array<CMatrix, Eigen::Dynamic, Eigen::Dynamic> CMMatrix;
CMMatrix a = CMMatrix::Constant(4, 4,CMatrix::Zero(3, 3));
CMMatrix b = CMMatrix::Constant(4, 4,CMatrix::Zero(3, 3));
CMMatrix c = a;
c += b;
return 0;
}
Surprisingly, the above code can be compiled successfully. What's the reason?
How can I fix the code by using Eigen 3.4 elegently, but not the way "c=a,c+=b;".
Thanks a lot!
The full eror information is as follows:
test_map.cpp:13:20: ambiguous overload for operator+ (operand types are CMMatrix {aka Eigen::Array<Eigen::Matrix<std::complex<float>, -1, -1>, -1, -1>} and CMMatrix {aka Eigen::Array<Eigen::Matrix<std::complex<float>, -1, -1>, -1, -1>})
CMMatrix c = a + b;
~~^~~
In file included from /eigen-3.4.0/Eigen/Core:19:0,
from test_map.cpp:2:
/eigen-3.4.0/Eigen/src/Core/../plugins/CommonCwiseBinaryOps.h:27:28: candidate: const Eigen::CwiseBinaryOp<Eigen::internal::scalar_sum_op<typename Eigen::internal::traits<T>::Scalar, typename Eigen::internal::traits<OtherDerived>::Scalar>, const Derived, const OtherDerived> Eigen::ArrayBase<Derived>::operator+(const Eigen::ArrayBase<OtherDerived>&) const [with OtherDerived = Eigen::Array<Eigen::Matrix<std::complex<float>, -1, -1>, -1, -1>; Derived = Eigen::Array<Eigen::Matrix<std::complex<float>, -1, -1>, -1, -1>; typename Eigen::internal::traits<OtherDerived>::Scalar = Eigen::Matrix<std::complex<float>, -1, -1>; typename Eigen::internal::traits<T>::Scalar = Eigen::Matrix<std::complex<float>, -1, -1>]
EIGEN_MAKE_CWISE_BINARY_OP(operator+,sum)
^
/eigen-3.4.0/Eigen/src/Core/util/Macros.h:1339:4: in definition of macro \u2018EIGEN_MAKE_CWISE_BINARY_OP
(METHOD)(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const \
^~~~~~
/eigen-3.4.0/Eigen/src/Core/../plugins/ArrayCwiseBinaryOps.h:241:29: candidate: const Eigen::CwiseBinaryOp<Eigen::internal::scalar_sum_op<typename Eigen::internal::traits<T>::Scalar, typename Eigen::internal::promote_scalar_arg<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::scalar_sum_op<typename Eigen::internal::traits<T>::Scalar, T> > >::value>::type>, const Derived, const typename Eigen::internal::plain_constant_type<Derived, typename Eigen::internal::promote_scalar_arg<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::scalar_sum_op<typename Eigen::internal::traits<T>::Scalar, T> > >::value>::type>::type> Eigen::ArrayBase<Derived>::operator+(const T&) const [with T = Eigen::Array<Eigen::Matrix<std::complex<float>, -1, -1>, -1, -1>; Derived = Eigen::Array<Eigen::Matrix<std::complex<float>, -1, -1>, -1, -1>; typename Eigen::internal::plain_constant_type<Derived, typename Eigen::internal::promote_scalar_arg<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::scalar_sum_op<typename Eigen::internal::traits<T>::Scalar, T> > >::value>::type>::type = Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<Eigen::Matrix<std::complex<float>, -1, -1> >, const Eigen::Array<Eigen::Matrix<std::complex<float>, -1, -1>, -1, -1> >; typename Eigen::internal::promote_scalar_arg<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::scalar_sum_op<typename Eigen::internal::traits<T>::Scalar, T> > >::value>::type = Eigen::Matrix<std::complex<float>, -1, -1>; typename Eigen::internal::traits<T>::Scalar = Eigen::Matrix<std::complex<float>, -1, -1>]
EIGEN_MAKE_SCALAR_BINARY_OP(operator+,sum)
^
/eigen-3.4.0/Eigen/src/Core/util/Macros.h:1365:4: in definition of macro EIGEN_MAKE_SCALAR_BINARY_OP_ONTHERIGHT
(METHOD)(const T& scalar) const { \
^~~~~~
/eigen-3.4.0/Eigen/src/Core/../plugins/ArrayCwiseBinaryOps.h:241:1: in expansion of macro \u2018EIGEN_MAKE_SCALAR_BINARY_OP
EIGEN_MAKE_SCALAR_BINARY_OP(operator+,sum)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我发现下面的代码可以工作。
I find the following code can work.