我使用Visual Studio 2015年为什么重载运算符==为std :: weak_ptr实例化与命名空间中定义的类型无法找到?
知道为什么这代码编译:
#include <memory>
class Foo;
class Bar;
typedef std::pair<Foo*,std::weak_ptr<Bar>> Object;
typedef std::vector<Object> ObjectVect;
bool operator==(std::weak_ptr<Bar> left,
std::weak_ptr<Bar> right)
{
return left.lock() == right.lock();
}
int main(int argc, char* argv[])
{
ObjectVect vect;
Object obj;
auto foundIter = std::find(vect.begin(), vect.end(), obj);
return 0;
}
而这一次给我的错误:
#include <memory>
class Foo;
namespace MyNamespace
{
class Bar;
}
typedef std::pair<Foo*,std::weak_ptr<MyNamespace::Bar>> Object;
typedef std::vector<Object> ObjectVect;
bool operator==(std::weak_ptr<MyNamespace::Bar> left,
std::weak_ptr<MyNamespace::Bar> right)
{
return left.lock() == right.lock();
}
int main(int argc, char* argv[])
{
ObjectVect vect;
Object obj;
auto foundIter = std::find(vect.begin(), vect.end(), obj);
return 0;
}
Error C2678 binary '==': no operator found which takes a left-hand operand of type 'const std::weak_ptr' (or there is no acceptable conversion) test_cppunit_interpreter_base_multi_output c:\program files (x86)\microsoft visual studio 14.0\vc\include\utility 216
看起来它failes到当Bar
位于命名空间中时找到比较器...
我做错了什么?或者这可能是一个编译器错误?
这可能会帮助:https://stackoverflow.com/a/3623643/2550156 _You应该把运算符重载在同一个命名空间为您的class._含有一种 – pergy
命名空间,应包括自由函数该类型也是如此。所以要回答*“我做错了什么?”*,我会说你使用错误的命名空间。 – StoryTeller
@StoryTeller免费函数对'std :: weak_ptr'有效,它不是**名称空间MyNamespace中包含的类型。 –
Walter