当我尝试编译以下程序时,编译器给出error: 'sqrtl' is not a member of 'std'。
#include <cmath>
#include <iostream>
int main(){
std::cout << std::sqrtl(5.0) << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想知道为什么会这样,所以我开始尝试。
当我std::在sqrtl程序前面删除时,编译并运行良好。当我另外删除时#include <cmath>,编译器给出error: 'sqrtl' was not declared in this scope。
在这一点上我真的很困惑。有明确必须是一个函数sqrtl中cmath,但它不是成员std?
当我更换sqrtl与sqrt原程序,该程序编译和运行良好。当我std::在前面移走时也是如此sqrt。当我另外删除时#include <cmath>,编译器给出error: 'sqrt' was not declared in this scope。
最后,我对进行了相同的测试sqrtf。与发生相同的事情sqrtl。
我觉得很奇怪的另一件事是,删除std::程序首先使程序可以编译。特别是with sqrt必须是的成员,std否则编译器将给出与sqrtl和相同的错误sqrtf。这特别令人困惑,因为std::在cout编译器前面删除会给我error: 'cout' was not declared in this scope。
谁能解释为什么sqrtl,sqrt并且sqrtf表现得如此奇怪?是sqrt的,即使一员std?我如何找出某个方法是否为成员std?
我知道删除std::是一个简单的修复程序,但是出于一致性的目的,我希望在我的个人图书馆中std::的所有std成员面前。
这是一个错误。每个[cmath.syn] sqrtl是std名称空间的成员。
Run Code Online (Sandbox Code Playgroud)namespace std { [...] float sqrt(float x); // see [library.c] double sqrt(double x); long double sqrt(long double x); // see [library.c] float sqrtf(float x); long double sqrtl(long double x); [...] }
GCC中有一个有关此问题的错误报告,但由于它很琐碎且资源有限,因此尚未得到解决。