将智能指针放在STL容器中

时间:2015-05-27 00:01:35

标签: c++ boost smart-pointers

我有一个容器,我想填写指向C类的指针。但是,我宁愿使用Boost shared_ptr而不是哑指针。

我将容器声明为container<C*>,但后来收到此错误:

  no known conversion for argument 1 from ‘boost::shared_ptr<C>’ to ‘C* const&’

我应该如何声明容器以获取boost共享ptrs?如果可能的话,我也希望它能够采取愚蠢的指针。

UPDATE:从响应中,似乎确实必须声明容器采用智能指针,不能使两者智能或哑指针。也就是说,没有从聪明到愚蠢的强迫或相反的强迫。这是对的吗?

2 个答案:

答案 0 :(得分:2)

这是一个使用C ++ 11共享指针的简单工作演示。它们类似于Boost共享指针。

#include <iostream>
#include <memory>
#include <vector>

int main( int argc, char* argv[] )
{
    // Create vector
    std::vector<std::shared_ptr<int>> buffer;

    for( int i=0; i<10; i++ )
        buffer.push_back(std::make_shared<int>(i));

    for( int i=0; i<10; i++ )
        if( (*buffer[i]) != i ){
            std::cout << "Match invalid for " << i << "." << std::endl;
            return 1;
        }
    std::cout << "Valid result" << std::endl;

    return 0;
}

我使用

编译了这个
g++ main.cpp -o main -std=c++11

答案 1 :(得分:0)

为了使用向量,您需要明确指定它们将要保留的对象类型。在您的情况下,它将是boost::shared_ptr。我也明白你想在那个容器中存储哑指针。您可能意味着原始指针。如前所述,您的容器可以主要存储一种类型,但是有例外,例如类型通过继承或其他机制(例如序列化)相关,当您尝试时需要一些显式的向下转换使用这些对象或类型是泛型类型。从来没有。这是另一种方法。您不需要存储智能指针和原始指针的向量,因为您始终可以从智能指针获取原始/哑指针。你最好的方法是创建一个这样的矢量

std::vector<boost::shared_ptr<foo>> vec;

上面创建了一个向量,它将共享指针存储到foo。

然后你有一个共享指针

 boost::shared_ptr<foo> foo_ptr(new foo());

你可以做这样的事情

vec.push_back(foo_ptr)

当你需要哑指针时,你可以这样做

foo* f = vec[0].get();

我已阅读您说明的更新

  

......似乎确实要声明容器采取智能   指针,它不能用智能或愚蠢的指针。

你应该明白boost::shared_ptr<Type>是一个智能指针。

相关问题