SmileyCraft
SmileyCraft

Reputation: 257

c++ gcc error: 'sqrtl' is not a member of 'std'

When I try to compile the following program, the compiler gives error: 'sqrtl' is not a member of 'std'.

#include <cmath>
#include <iostream>
int main(){
    std::cout << std::sqrtl(5.0) << "\n";
    return 0;
}

I wanted to know why this happens, so I started experimenting.

When I remove std:: in front of sqrtl the program compiles and runs fine. When I additionally remove #include <cmath>, the compiler gives error: 'sqrtl' was not declared in this scope.

At this point I am really confused. There clearly has to be a function sqrtl in cmath, but it is not a member of std?

When I replace sqrtl with sqrt in the original program, the program compiles and runs fine. Same thing when I remove std:: in front of sqrt. When I additionally remove #include <cmath>, the compiler gives error: 'sqrt' was not declared in this scope.

Finally, I did the same test with sqrtf. The same thing happened as with sqrtl.

Another thing I find weird is that removing std:: lets the program compile in the first place. Especially with sqrt which must be a member of std or the compiler would have given the same error as sqrtl and sqrtf. This is especially confusing since removing std:: in front of cout makes the compiler give me error: 'cout' was not declared in this scope.

Can anyone explain why sqrtl, sqrt and sqrtf behave so strangely? Is sqrt even a member of std? How could I find out whether a certain method is a member of std or not?

I know removing std:: is an easy fix, but for consistency purposes I like to have std:: in front of all std members in my personal library.

Upvotes: 4

Views: 2174

Answers (1)

NathanOliver
NathanOliver

Reputation: 180935

This is a bug. Per [cmath.syn] sqrtl is a member of the std namespace.

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);
      [...]
}

This is legal code and will compile in MSVS and Clang.

There is a bug report for this in GCC but it has not yet been taken care of since it is very trivial and their resources are finite.

Upvotes: 8

Related Questions