誰かがg ++からの警告を私に説明することができますか?名前空間内で宣言された友人演算子を定義する警告
私は(Visual Studioの(2017年のコミュニティ)から(おかげRobert.M)ない6.3.0(++グラムから)ではなく打ち鳴らすから++(3.8.1)と)を取得次のコード
#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;
}
を考えますこの警告
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 &); };
^~~~~~~~
私は
私のイニシアと間違って何namespace foo
{
std::ostream & operator<< (std::ostream & o, bar const &)
{ return o; }
}
けど...を次のように私はオペレータを定義することができることを知っていますコード?
これは役立つはずです https://stackoverflow.com/questions/3891402/operator-overloading-and-namespaces –
解決策が見つかったのですか、それともなぜこのようなコメントがありましたか?また、なぜあなたは最初にそこに友人を置いたのですか?これは仕事に必要ですか? – Ilendir
@Ilendir - 現時点では "解決策"が見つかりませんでした(しかし、私は "解決策"を探しません;私は説明を求めます)。 (オリジナルの、より複雑な)コードの最初のバージョンは私のものではなく、オープンソースコードからのものです。私は、2番目のブロック( 'namespace foo'ブロック内の演算子)で示された方法でコードを修正することを提案しましたが、私の疑問は残っています:なぜ最初は間違っていますか? Robert.Mからの答えは間違っています。 – max66