我使用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