首页 > 解决方案 > 对 Eigen::Matrix 的未定义引用, 3, 3>

问题描述

我正在尝试使用 Eigen 编写一些代码,但是在尝试使用 g++ 编译时遇到了这个问题。

我有以下模板定义:

类.h

template<int Nr, int Nz>
Eigen::Matrix<std::complex<double>, Nr, Nz> efield(Eigen::Matrix<double, Nr, Nz>& rs, Eigen::Matrix<double, Nr, Nz>& zs, double t);

类.cpp

Eigen::Matrix<std::complex<double>, Nr, Nz> GaussianBeam::efield(Eigen::Matrix<double, Nr, Nz>& rs, Eigen::Matrix<double, Nr, Nz>& zs, double t) {
//Iterate through the rs, and zs to calculate the field in all combinations of r and z.
    Eigen::Matrix<std::complex<double>, Nr, Nz> output ;
    for (size_t i = 0, size = rs.size(); i < size; i++)
    {
        for (size_t j = 0, sizez = zs.size(); j < sizez; j++) {
            double temporary_r = (*(rs.data() + i));
            double temporary_z = (*(zs.data() + i));

            output(i, j) = this->efield(temporary_r, temporary_z, t);

        }
    }
    return output;
}

然后我从 main.cpp 调用这个函数:

const int Nx = 3;
const int Ny = 3;
    
//creates the "meshgrid"
Eigen::Matrix<double, Nx, Ny> X = Eigen::RowVectorXd::LinSpaced(Nx, -5e-4,5e-4).replicate(Ny,1);
Eigen::Matrix<double, Nx, Ny> Y = Eigen::VectorXd::LinSpaced(Ny, -5e-3, 5e-3).replicate(1, Nx);

std::cout << "res : \n" << gauss1.efield<3, 3>(X, Y, 0) << "\n";

在尝试通过 GCC 5.4.0 编译后,我在调用 gauss1.efield<3,3> 时收到以下错误:

对 `Eigen::Matrixstd::complex<double, 3, 3, ((Eigen::StorageOptions)0)|(((((3)==(1))&&((3)!=(1)) 的未定义引用))?((Eigen::StorageOptions)1) : (((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : (( Eigen::StorageOptions)0))), 3, 3> Optics::GaussianBeam::efield<3, 3>(Eigen::Matrix<double, 3, 3, ((Eigen::StorageOptions)0)|(( ((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)1) : (((((3)==(1))&&((3) !=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 3>&, Eigen::Matrix<double, 3, 3, ((Eigen ::StorageOptions)0)|((((3)==(1))&&((3)!=(1)))?((Eigen::StorageOptions)1) : ((((3)== (1))&&((3)!=(1)))?((Eigen::StorageOptions)0) : ((Eigen::StorageOptions)0))), 3, 3>&, double)'

奇怪的是,我预计 class.cpp 上可能会出现错误,但 main.cpp 上不会出现错误,因为这只是对该函数的常规调用。

我发现这个错误看起来与我的相似,但使用 std::vector 而不是 std::complex: Stack Overflow,我不知道它是否有帮助。任何想法为什么会发生这种情况?

顺便说一句,我确保

#include <complex>
#include <Eigen/Dense>

在每个相关文件中。

PS:我使用的是 C++14。

谢谢!

标签: c++gcccompiler-errorseigeneigen3

解决方案


推荐阅读