Someone can explain me a warning from g++ ?
Given the following code
#include <iostream>
namespace foo
{
struct bar
{ friend std::ostream & operator<< (std::ostream &, bar const &); };
}
std::ostream & foo::operator<< (std::ostream & o, foo::bar const &)
{ return o; }
int main ()
{
foo::bar fb;
std::cout << fb;
}
I get (from g++ (6.3.0) but not from clang++ (3.8.1) and not (thanks Robert.M) from Visual Studio (2017 community)) this warning
tmp_002-11,14,gcc,clang.cpp:10:16: warning: ‘std::ostream& foo::operator<<(std::ostream&, const foo::bar&)’ has not been declared within foo
std::ostream & foo::operator<< (std::ostream & o, foo::bar const &)
^~~
tmp_002-11,14,gcc,clang.cpp:7:29: note: only here as a friend
{ friend std::ostream & operator<< (std::ostream &, bar const &); };
^~~~~~~~
I know that I can define the operator as follows
namespace foo
{
std::ostream & operator<< (std::ostream & o, bar const &)
{ return o; }
}
but... what's wrong with my initial code ?
Consider this simple program:
namespace xxx {
struct foo {
friend void bar();
};
}
int main() {
xxx::bar();
}
You will get a compilation error (with clang too) because bar is not declared in namespace xxx.
Now consider this:
namespace xxx {}
void xxx::bar() {}
This will also fail for the same exact reason, bar is not declared in namespace xxx.
Now when you combine the two, there's no reason why the combination should suddenly become legal. bar is still not declared in namespace xxx. Yet clang permits it. This behaviour is inconsistent and confusing, and is best described as a bug.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With