boost :: python и set :: erase -> странное поведение

Я пытаюсь сохранить объекты в std :: set. Эти объекты - boost :: shared_ptr <>, взятые из среды python. добавление значений в набор не вызовет никаких проблем. Но когда я пытаюсь стереть значение, даже если я передаю ту же самую ссылку, это не сработает. Вот пример:

#include <set>
#include <iostream>

#include <boost/shared_ptr.hpp>
#include <boost/python.hpp>

using namespace std;
using namespace boost;
using namespace boost::python;

struct Bar
{
    Bar() {}
};

struct Foo
{
    set< shared_ptr<Bar> > v_set;
    shared_ptr<Bar> v_ptr;

    Foo() {}

    void add( shared_ptr<Bar> v_param ) {
    cout << "storing " << v_param << "in v_set and v_ptr" << endl;
    v_set.insert(v_param);
    v_ptr = v_param;

    }

    void del( shared_ptr<Bar> v_param ) {
    cout << "deleting " << v_param << endl;
    if (v_param == v_ptr) {
        cout << "v_param == v_ptr" << endl;
    } else {
        cout << "v_param != v_ptr" << endl;
    }

    cout << "erasing from v_set using v_param" << endl;
    if (v_set.erase(v_param) == 0) {
        cout << "didn't erase anything" << endl;
    } else {
        cout << "erased !" << endl;
    }

    cout << "erasing from v_set using v_ptr" << endl;
    if (v_set.erase(v_ptr) == 0) {
        cout << "didn't erase anything" << endl;
    } else {
        cout << "erased !" << endl;
    }
    }
};

BOOST_PYTHON_MODULE (test)
{
    class_< Foo, shared_ptr<Foo> >("Foo")
        .def("add",&Foo::add)
        .def("remove",&Foo::del);

    class_< Bar, shared_ptr<Bar> >("Bar");    
}

компиляция:

%> gcc -pthread -fno-strict-aliasing -march=i686 -mtune=generic -O2 -pipe -DNDEBUG -march=i686 -mtune=generic -O2 -pipe -fPIC -I/usr/include/python2.7 -c test.cpp -o test.o

%> g++ -pthread -shared -Wl,--hash-style=gnu -Wl,--as-needed build/temp.linux-i686-2.7/test.o -L/usr/lib -lboost_python -lpython2.7 -o test.so

а теперь небольшой скрипт на Python:

from test import *

f = Foo()
b = Bar()

f.add(b)

f.remove(b)

Вот результат:

storing 0x8c8bc58in v_set and v_ptr
deleting 0x8c8bc58
v_param == v_ptr
erasing from v_set using v_param
didn't erase anything
erasing from v_set using v_ptr
erased !
  • Я храню 0x8e89c58 внутри набора и снаружи, на всякий случай
  • Я передача одной и той же ссылки на оба вызова (0x8e89c58)
  • , чтобы убедиться, что я проверяю, v == val
  • Я пытаюсь стереть, используя v - это не работает
  • Я пытаюсь стереть, используя вал - работает!

Я совершенно потерялся там - не вижу, что это за причина. Любой ввод?

6
задан John Zwinck 20 November 2011 в 19:57
поделиться