Выпуск boost :: ptr_vector, не соответствующий документации - PullRequest
4 голосов
/ 17 февраля 2010

Я использую boost 1.37 и пытаюсь использовать boost :: ptr_vector и передать владение им, чтобы я мог вернуть его из функции. Глядя на документацию буста (http://www.boost.org/doc/libs/1_36_0/libs/ptr_container/doc/tutorial.html#new-functions)

std::auto_ptr< boost::ptr_deque<animal> > get_zoo()
{
    boost::ptr_deque<animal>  result;
    ...
    return result.release(); // give up ownership
 }
 ...
 boost::ptr_deque<animal> animals = get_zoo();    

Я пытался:

#include "iostream"
#include <boost/ptr_container/ptr_vector.hpp>

class Item
{
public:
  int my_val;
  Item() : my_val(0) { }
};

class MyClass
{
private:
  boost::ptr_vector<Item> items_;  

public:
  MyClass() 
  { 
    for (int i = 0; i < 10; ++i)
      items_.push_back(new Item);
  }

  std::auto_ptr<boost::ptr_vector<Item> > getData() { return items_.release(); }
};

int totalItems(boost::ptr_vector<Item> items)
{
  int total = 0;
  boost::ptr_vector<Item>::iterator it;
  for (it = items.begin(); it != items.end(); ++it)
    total += (*it).my_val;
  return total;
}

int main(int argc, char **argv)
{
  MyClass cls;

  boost::ptr_vector<Item> items = cls.getData();

  int total = totalItems(items);

  fprintf(stdout, "I found %d items!\n", total);

  return 0;

}

Ошибки компиляции:

In function ‘int main(int, char**)’:
error: conversion from ‘std::auto_ptr<boost::ptr_vector<Item, boost::heap_clone_allocator, std::allocator<void*> > >’ to non-scalar type ‘boost::ptr_vector<Item, boost::heap_clone_allocator, std::allocator<void*> >’ requested

Это глюк в документации по бусту? Могу ли я получить auto_ptr и разыменование, чтобы вернуть ptr_vector?

1 Ответ

6 голосов
/ 17 февраля 2010

Да, это ошибка документации. Как и в случае auto_ptr (и любого другого типа с семантикой передачи прав собственности), конструктор передачи в ptr_deque имеет значение explicit, поэтому вы не можете использовать форму инициализатора =. Вы должны сделать:

boost::ptr_vector<Item> items(cls.getData());

Кроме того, неправильным является только учебник; фактическая ссылка на класс правильно показывает это. Если вы посмотрите здесь , вы увидите объявление:

 explicit reversible_ptr_container( std::auto_ptr<reversible_ptr_container> r );

Примечание explicit.

...