【发布时间】:2018-08-21 14:41:42
【问题描述】:
我正在尝试为在另一个命名空间中定义的类型 T 定义一个相等运算符,然后在 optional<T> 上使用相等运算符。在 clang (Apple LLVM 9.1.0) 上,此代码:
namespace nsp {
struct Foo {
};
}
bool operator==(const nsp::Foo& a, const nsp::Foo& b);
void foo() {
optional<nsp::Foo> a = none;
optional<nsp::Foo> b = none;
if (a == b)
;
}
导致错误:
/usr/local/include/boost/optional/detail/optional_relops.hpp:29:34: error: invalid operands to binary expression ('const nsp::Foo' and 'const nsp::Foo')
{ return bool(x) && bool(y) ? *x == *y : bool(x) == bool(y); }
~~ ^ ~~
MWE.cpp:40:19: note: in instantiation of function template specialization 'boost::operator==<what3words::engine::nsp::Foo>' requested here
if (a == b)
^
/usr/local/include/boost/optional/detail/optional_relops.hpp:28:6: note: candidate template ignored: could not match 'optional<type-parameter-0-0>' against 'const nsp::Foo'
bool operator == ( optional<T> const& x, optional<T> const& y )
发生了什么事?我的猜测是这与 Koenig 查找规则有关......
【问题讨论】:
-
长话短说:在与结构相同的命名空间中定义相等运算符。
标签: c++ boost argument-dependent-lookup