C++ 复杂库编译错误

C++ Complex library compile error

本文关键字:错误 编译 复杂 C++      更新时间:2023-10-16

这是我的代码:

#include <iostream>
#include <iomanip>
#include <complex>
#include <cmath>
int main()
{
using namespace std::complex_literals;
std::cout<< std::fixed<<std::setprecision(1);
std::complex<double> z1= 1i *1i;   //imaginary unit squared
std::cout<<"i * i= " <<z1 <<'n';
std::complex<double> z2=std::pow(1i, 2); //imaginary unit squared
std::cout <<"pow(i,2) =" <<z2 <<'n';

}

我用 gcc hello.cpp -lstdc++ -o hello.o 编译

基本上,当我做 std::complex z2=std::p ow(1i, 2);..

我收到以下错误

错误:调用"pow(Complexint, int)"没有匹配函数 std::complex z2=std::p ow(1i, 2);

但是,如果我删除复数并执行 std::complex z2=std::p ow(2, 2);

它返回4,正确答案。

还有更多的编译错误行,但我把它写得很简短

这个答案是对原始问题的注释:

您必须强制编译器将 C++14 标准与-std=c++14选项一起使用,因为文字operator""i是 C++14 规范的一部分。

GCC 从版本 6.1 开始默认使用 c++14。使用gcc -v检查您的编译器版本,并参考此链接以获取 GCC 标准支持。

编辑:

我能够通过Richard Critten先生在原始问题的评论中提供的链接重现GCC 6.3的编译问题,他是第一个指出正确答案的人。我很抱歉,因为我完全忽略了对C++14标准的引用。

无论如何,为了清楚起见,我正在编辑这个答案,因为我发现了一些可能很有趣的东西来分享。

使用 GCC 6.3 编译失败的原因是参考标准已在 2016 年 12 月从 C++14 更改为 GNU++14,请参阅此处。

GNU++14 是 C++ 标准的扩展,除其他外,它为标准 API 提供了额外的函数重载。

我发现使用 GNU++14 SFINAE 无法为 std::p ow() 函数找到适当的重载,除非在模板调用中显式设置类型,如下面的截图所示:

std::complex<double> z2=std::pow<double>(1i, 2);

GNU++14 包括对cmathcomplex头文件的更改,我认为这是问题的原因。 打开 C++14 标志(不再是默认值)可以解决问题。

我不知道为什么它没有在您的系统上编译,它在我的系统上运行良好。

我认为您的编译器有问题。而且,不是版本。然而你可以尝试std::cout << __cplusplus.看看这打印了什么。

C++11 无法识别 std::complex_literals,所以怀疑是否如此,但编译器仍然找不到该函数。 老实说,我不明白它为什么要搜索(复杂的 int、int)。编译器已损坏或旧的测试版。

您应该下载新版本的编译器或在某处在线运行它。尝试添加 -std=c++14,但我怀疑这会有所帮助。

在这里尝试您的代码(它有效): https://www.jdoodle.com/online-compiler-c++14

所以,我安装了Microsoft Visual Studio。我正在使用 clang 编译器,我的程序运行流畅,没有错误!

感谢所有的帮助,但我认为 clang 是一个更好的 c++ 编译器