C++ 复杂库编译错误

标签 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);..

我得到以下错误

错误:没有匹配函数来调用“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 包括对 cmathcomplex 头文件的更改,我认为这是问题的原因。 打开 C++14 标志(不再是默认标志)可以解决问题。

关于C++ 复杂库编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49954826/

相关文章:

c++ - Windows RT on ARM native 代码调用约定是什么?

c++ - 有没有办法将对象的字段隐式传递给 C++ 中的函数

c++ - 排序 vector 上 std::lower_bound 的时间复杂度

c++ - 修复了 VSync 打开时的时间步长卡顿

c++ - 在杂货店找零钱

C++ 指针运行时错误 - 使用指针设置变量然后检索

c++ - 为什么这个二进制 apply_visitor 不工作?

c++ - 如何将值附加到命令行参数数组?

c++ - 打印 std::array

multithreading - 在 Linux 2.6+ 中替换系统调用(syscalls)