我遇到了这个问题:
// 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
}
}
问题(如here所述)是因为隐藏而a += b;
无法编译;而 ADL 没有找到,因为 ADL 只在这种情况下搜索。Bar::operator+=(Qux&, Qux const &)
::operator+=
::operator+
namespace std;
这很棘手,因为问题仅在包含时才会出现B.h
- 但B.h
显然与Buffer
. 代码不应该根据我是否包含另一个标题而中断。
(实际上我只是在更改编译器时才发现这一点,我使用的以前的编译器确实名称查找错误并接受了代码)。
我的问题是:A.h
由于这个问题,过载只是一个坏主意吗?
我现在通过在里面B.h
做来解决这个问题,但这似乎很hacky,有更好的选择吗?using ::operator+=;
namespace Bar