这是我的代码:
#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,正确答案..
还有很多编译错误,但我简短了
答案 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包含对cmath
和complex
头文件的更改,我认为这是该问题的原因。
打开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 ++编译器