“+=” 在 std::complex<double> 和 __complex__ double 类型之间不起作用。

3
我将使用Eigen在C++中执行一些矩阵操作。具体而言,我有一行代码大致如下:
MatrixXcd A = MatrixXcd::Zeros(10,10);
A(0,0) += 2.0*1i;

在我的本地计算机上编译没有问题。但是,在使用相同的CMake文件在另一台计算机上编译时,会出现以下错误:

error: no match for ‘operator+=’ (operand types are ‘Eigen::DenseCoeffsBase<Eigen::Matrix<std::complex<double>, -1, -1>, 1>::Scalar {aka std::complex<double>}’ and ‘__complex__ double’)

因此,一些类型std::comple<double>__complex__ double是不同的,计算机无法解决差异。有人能解释一下这些差异是什么,如何消除这种差异吗?我可以尝试弄清楚这两台计算机配置的不同之处,但那似乎是一个更难以在线获得帮助的问题。


这与Eigen有关,还是您只是使用std::complex<double> a{}; a+=2.0*1i;时出现了相同的行为?(您应该提供一个[mre],包括每台计算机上使用的编译器和参数) - chtz
2个回答

2
C++14新增了新的字面量语法,使得a+bi被解析为std::complex<double>

只需要添加即可。

set(CMAKE_CXX_STANDARD 14) # or 17

在您的CMakeLists.txt文件中添加

,以使两个编译器再次达成一致。


这行代码已经包含在CMake文件中,但是错误仍然存在。 - Henry Shackleton
然后您需要开始比较编译器版本。 - Botje
1
你需要添加 using namespace std::literals::complex_literals; - ggael

1
请确认您添加了以下这行代码:

using namespace std::complex_literals;

在你的main()函数开头处添加此内容。
另外,请检查您可能想执行A(0,0) += 2.0 + 1i;而不是A(0,0) += 2.0*1i;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接