继前面的问题: weak_ptr 的 operator== 操作
遇到另一个问题:
#include <vector>
#include <algorithm>
#include <boost/smart_ptr.hpp>
using namespace std;
#define MakeShared boost::make_shared
#define SharedPtr boost::shared_ptr
#define WeakPtr boost::weak_ptr
template <typename T, typename U>
bool operator == (const WeakPtr<T> &lhs, const WeakPtr<U> &rhs) {
return !(lhs < rhs) && !(rhs < lhs);
}
namespace hello_ns {
struct MyObject {
char dump;
};
typedef vector<WeakPtr<MyObject> > MyObjectVector;
MyObjectVector vec_objects;
bool isExistObject(WeakPtr<MyObject> wp_obj) {
MyObjectVector::iterator iter = find(vec_objects.begin(), vec_objects.end(), wp_obj);
return iter != vec_objects.end();
}
}
int main() {
SharedPtr<hello_ns::MyObject> obj = MakeShared<hello_ns::MyObject>();
hello_ns::isExistObject(obj);
return 0;
}
上述代码编译是会出错的。错误信息:
即使我已在上面定义了WeakPtr比较的 operator==() 函数,但还是不行。
使用 clang++也是报错,错误的提示:
看来这不是编译器的bug。
但是,将 operator==() 函数移到 hello_ns 里面,就可以了。
为什么会这样?不是在本层namespace中找不到的东西,就去上层寻找不?如果按这个规律,那么全局的 operator == 应该能被看到才是呀!
这个问题现象很难理解。