c++ - 对 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。
谢谢!
解决方案
推荐阅读
- hibernate - Hibernate添加了一个select中不存在的列
- php - 我如何更改在 mysql 数据库上自动创建的表中的列名,而无需在每次需要完成时创建 ALTER TABLE 脚本
- python - 提取推文提及,包括“@”但不包括域部分,例如使用正则表达式的@xyz.com
- spring-boot - Springboot:如果 url 中有 %2F,则捕获异常
- django - Django - 第一次调用反转很慢
- c++ - 如何使用热键在 DEV C++ 命令提示符中粘贴文本?
- android - 使用 MVP 控制 Android 中的可见性
- java - 使用 GSON 解析器迭代数据集
- java - 带有 Firebase 搜索的 RecyclerView 在搜索时显示所有产品
- asp.net - Azure 构建管道:dotnet 构建失败,并出现:FileNotFoundException:无法加载文件或程序集 'TechTalk.SpecFlow,版本 = 3.1.0.0