C ++复杂库编译错误

时间:2018-04-21 10:29:52

标签: c++ c++11

这是我的代码:

#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)时,它不会让我的复数加倍:..

我收到以下错误

错误:没有匹配函数来调用&#39; pow(复杂 int,int)&#39;  std :: complex z2 = std :: pow(1i,2);

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

它返回4,正确答案..

还有很多编译错误,但我简短了

3 个答案:

答案 0 :(得分:1)

这个答案跟进对原始问题的评论:

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

自版本6.1以来,GCC默认使用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()函数找到正确的重载,除非在模板调用中显式设置了类型,如下面的snipped所示:

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

GNU ++ 14包含对cmathcomplex头文件的更改,我认为这是该问题的原因。 打开C ++ 14标志,这不再是默认值,修复了问题。

答案 1 :(得分:0)

我不知道为什么它没有在你的系统上进行编译,它在我的网上运行正常。

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

C ++ 11并不能识别std :: complex_literals,所以怀疑是这种情况,但编译器仍然无法找到该函数。 老实说,我不明白它为什么要搜索(complex int,int)。编译器已损坏或旧的beta版本。

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

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

答案 2 :(得分:0)

所以,我安装了Microsoft Visual Studio ..我正在使用clang编译器,我的程序运行顺利,没有任何错误!

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