2010-02-17 79 views
4

我正在使用boost 1.37,並試圖使用boost :: ptr_vector,並轉讓它的所有權,以便我可以從函數返回它。縱觀Boost文檔(http://www.boost.org/doc/libs/1_36_0/libs/ptr_container/doc/tutorial.html#new-functions發佈boost :: ptr_vector,不匹配文檔

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嗎?

回答

6

是的,這是一個文檔錯誤。與auto_ptr(以及任何其他類型的所有權轉移語義)一樣,ptr_deque上的轉移構造函數爲explicit,因此您不能使用=初始化形式。你必須這樣做:

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

此外,它只是教程是錯誤的;實際的類參考正確地顯示了這一點。如果你看看here,你會看到聲明:

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

explicit

+0

感謝您的支持,現在一切正常。 – kevbo