J'ai un code qui ressemble à:est back_insert_iterator <> sûr d'être passé par valeur?
struct Data { int value; };
class A {
public:
typedef std::deque<boost::shared_ptr<Data> > TList;
std::back_insert_iterator<TList> GetInserter()
{
return std::back_inserter(m_List);
}
private:
TList m_List;
};
class AA {
boost::scoped_ptr<A> m_a;
public:
AA() : m_a(new A()) {}
std::back_insert_iterator<A::TList> GetDataInserter()
{
return m_a->GetInserter();
}
};
class B {
template<class OutIt>
CopyInterestingDataTo(OutIt outIt)
{
// loop and check conditions for interesting data
// for every `it` in a Container<Data*>
// create a copy and store it
for(... it = ..; .. ; ..) if (...) {
*outIt = OutIt::container_type::value_type(new Data(**it));
outIt++; // dummy
}
}
void func()
{
AA aa;
CopyInterestingDataTo(aa.GetDataInserter());
// aa.m_a->m_List is empty!
}
};
Le problème est que A::m_List
est toujours vide même après CopyInterestingDataTo()
est appelé. Cependant, si je débogue et passe à CopyInterestingDataTo()
, l'itérateur stocke les données supposées insérées!
mise à jour: J'ai trouvé le coupable. J'ai en fait quelque chose comme:
class AA {
boost::scoped_ptr<A> m_a;
std::back_insert_iterator<A::TList> GetDataInserter()
{
//return m_a->GetInserter(); // wrong
return m_A->GetInserter(); // this is the one I actually want
}
// ..... somewhere at the end of the file
boost::scoped_ptr<A> m_A;
};
Maintenant, quelle réponse dois-je marquer comme réponse? Vraiment désolé pour ceux qui ne sont pas choisis, mais vous avez certainement eu quelques votes up:)
Peut-être qu'il est temps de réviser vos directives de style ... en gardant tous les champs ensemble aurait pu vous aider . J'en utilise un simple: la cohérence, toujours ajouter des membres où les autres membres sont. –
@dribeas: et le cas de la lettre était également un problème. –