该代码在 Eigen 3.2 中有效,但在 Eigen 3.4 中失败。有谁知道原因?

发布于 2025-01-09 21:21:37 字数 5944 浏览 4 评论 0原文

以下代码可以在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夏雨凉 2025-01-16 21:21:37

我发现下面的代码可以工作。

 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.matrix() + b.matrix();
    return 0;
}

I find the following code can work.

 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.matrix() + b.matrix();
    return 0;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文