Кажется, есть проблема при использовании общих указателей вместе с пользовательским оператором равенства и std :: list.
Я собрал следующий пример кода, чтобы продемонстрировать проблему.
Прежде чем пытаться скомпилировать это:
Я использую gcc version 4.5.2 20110127
со следующей командной строкой:
g++ -g -O0 -std=gnu++0x test.cpp
Источник не скомпилируется, если функции c ++ 0x не включены.
#include<list>
#include<boost/shared_ptr.hpp>
using std::list;
using std::shared_ptr;
using std::cout;
using std::endl;
class TestInt
{
public:
TestInt(int x);
bool operator==(const TestInt& other);
private:
int _i;
};
TestInt::TestInt(int x)
{
_i = x;
}
bool
TestInt::operator==(const TestInt& other)
{
if (_i == other._i){
return true;
}
return false;
}
class Foo
{
public:
Foo(TestInt i);
shared_ptr<TestInt> f(TestInt i);
private:
list<shared_ptr<TestInt>> _x;
};
Foo::Foo(TestInt i)
{
_x.push_back(shared_ptr<TestInt>(new TestInt(i)));
};
shared_ptr<TestInt>
Foo::f(TestInt i)
{
shared_ptr<TestInt> test(new TestInt(i));
int num = _x.size();
list<shared_ptr<TestInt>>::iterator it = _x.begin();
for (int j=0; j<num; ++j){
if (test == *it){
return test;
}
++it;
}
throw "Error";
}
int main(){
TestInt ti(5);
TestInt ti2(5);
Foo foo(ti);
foo.f(ti2);
std::cout << "Success" << std::endl;
}
Я бы ожидал, что код заканчивается на Success
, но вместо этого он выдает.
Вставка *
infront test
, а также *it
устраняет проблему, но я понимаю, что когда shared_ptr вызывает __a.get() == __b.get()
в своем операторе ==
, он должен использовать пользовательский оператор равенства TestInt
. Я не понимаю, почему это не так. Это ошибка?
Заранее спасибо.