Я использую Visual Studio 2015.
Любая идея, почему этот код компилируется:
#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;
}
Двоичный код ошибки C2678 '==': не найден оператор, который принимает левый операнд типа 'const std::weak_ptr' (или нет приемлемого преобразования) test_cppunit_interpreter_base_multi_output c:\program files (x86)\microsoft visual studio 14.0\ vc\include\утилита 216
Похоже, ему не удается найти компаратор, когда Bar
находится в пространстве имен...
Я делаю что-то неправильно? Или это может быть ошибка компилятора?
std::weak_ptr<Bar>
, который не относится к типу, содержащемуся вnamespace MyNamespace
. - person Walter   schedule 04.07.2017Bar
есть. - person Walter   schedule 04.07.2017