这是我的代码:
#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::pow(1i, 2);..
我得到以下错误
错误:没有匹配函数来调用“pow(complex int, int)” std::complex z2=std::pow(1i, 2);
但是,如果我删除复数并执行 std::complex z2=std::pow(2, 2);
它返回 4,正确答案..
还有很多行编译错误,不过我写的很简短
最佳答案
这个答案是对原始问题的评论的后续:
您必须通过 -std=c++14
选项强制编译器使用 c++14 标准,因为文字 operator""i
是一部分C++14 规范。
GCC 自 6.1 版起默认使用 c++14。 使用 gcc -v
检查您的编译器版本并引用此 link用于 GCC 标准支持。
编辑:
我能够通过 Richard Critten 先生在对原始问题的评论中提供的链接重现 GCC 6.3 的编译问题,他是第一个指出正确答案的人。我很抱歉,因为我完全忽略了对 C++14 标准的引用。
无论如何,为了清楚起见,我正在编辑这个答案,因为我发现了一些可能很有趣的东西可以分享。
GCC 6.3 编译失败的原因是引用标准在 2016 年 12 月从 C++14 更改为 GNU++14,参见 here .
GNU++14 是 C++ 标准的扩展,除其他外,它为标准 API 提供了额外的函数重载。
我发现使用 GNU++14 SFINAE 无法为 std::pow() 函数找到合适的重载,除非类型在模板调用中明确设置,如下面的片段所示:
std::complex<double> z2=std::pow<double>(1i, 2);
GNU++14 包括对 cmath
和 complex
头文件的更改,我认为这是问题的原因。
打开 C++14 标志(不再是默认标志)可以解决问题。
关于C++ 复杂库编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49954826/