【问题标题】:C++ Complex library compile errorC++ 复杂库编译错误
【发布时间】:2018-04-21 10:29:51
【问题描述】:

这是我的代码:

#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::pow(2, 2) 只是简单的2 提升到2 的幂。它与虚数或复数无关,它是标准的浮点 std::pow 函数。
  • 编译将 using namespace std::complex_literals; 更改为 using namespace std::literals::complex_literals; 需要 C++14 链接:godbolt.org/g/3yrjN7
  • @RichardCritten 没用
  • @Someprogrammerdude 你是说 std::pow 不能提高复数的幂吗?
  • 如果在 gcc 命令行中添加 -std=c++14 选项会发生什么?

标签: c++ c++11


【解决方案1】:

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

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

GCC 自 6.1 版起默认使用 c++14。 使用 gcc -v 检查您的编译器版本,并参考此 link 以获得 GCC 标准支持。

编辑:

我能够通过 Richard Critten 先生在 cmets 中提供的指向原始问题的链接重现 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 标志可以解决问题。

【讨论】:

  • 我的 gcc 版本是 6.3.0
  • 我认为问题在于您使用命令 gcc 而不是 g++。使用 g++ 自动链接 stdc++ 库并设置默认标准参考。
  • 我用 g++ -Wall -Wextra -Werror -c hello.cpp -o hello.o 编译,我得到了编译错误
  • 一些关于错误的提示? :) 试试 g++ -o hello hello.cpp
  • hello.cpp: In function 'int main()': error: no matching function for call to 'pow(complex int, int)' std::complex z2=std::pow(1i, 2);
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我不同意,但不管你的船是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 2016-03-24
    • 2015-08-08
    • 1970-01-01
    • 2012-08-06
    • 2022-08-17
    相关资源
    最近更新 更多