この問題が発生しました:
// A.h
#include <vector>
typedef std::vector<unsigned char> Buffer;
Buffer &operator+=(Buffer &a, Buffer const &b);
// B.h
namespace Bar
{
struct Qux { };
Qux &operator+=(Qux &a, Qux const &b);
}
// Foo.cpp
#include "A.h"
#include "B.h" // comment this out, error goes away
namespace Bar
{
void foo()
{
Buffer a, b;
a += b; // error
}
}
問題 (ここで説明されているように) は、hides がa += b;
原因でコンパイルに失敗することです。この場合、 ADL は検索のみを行うため、ADL は検索しません。Bar::operator+=(Qux&, Qux const &)
::operator+=
::operator+
namespace std;
B.h
が含まれている場合にのみ問題が発生するため、これはやっかいB.h
ですBuffer
。別のヘッダーを含めるかどうかに応じて、コードが壊れることはありません。
(実際には、コンパイラを変更したときにのみこれを発見しました。使用していた以前のコンパイラは、名前の検索を誤って実行し、コードを受け入れました)。
私の質問は:A.h
この問題のために過負荷は悪い考えですか?
内部でB.h
行うことで今のところ問題を回避していますが、これはかなりハックなようです。より良いオプションはありますか?using ::operator+=;
namespace Bar