Tôi đang sử dụng Visual Studio 2015.Tại sao toán tử quá tải == cho std :: weak_ptr instantiated với kiểu được xác định trong không gian tên không thể tìm thấy?
Bất cứ ý tưởng tại sao mã này biên dịch:
#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;
}
trong khi một này mang lại cho tôi lỗi:
#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
Hình như nó failes để tìm bộ so sánh khi Bar
nằm trong một không gian tên ...
Tôi có làm gì sai không? Hoặc đây có thể là lỗi trình biên dịch không?
Điều này có thể giúp: https://stackoverflow.com/a/3623643/2550156 _Bạn nên đặt quá tải toán tử trong cùng một không gian tên như lớp của bạn._ – pergy
Không gian tên chứa loại, phải bao gồm các chức năng miễn phí của loại đó. Vì vậy, để trả lời * "Tôi có làm gì sai không?" *, Tôi muốn nói rằng bạn đang sử dụng không gian tên sai. – StoryTeller
@StoryTeller Hàm miễn phí hoạt động trên 'std :: weak_ptr', là ** không ** loại chứa trong 'không gian tên MyNamespace'. –
Walter