繁体   English   中英

将智能指针放置在STL容器中

[英]Placing smart pointers in an STL container

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

我将容器声明为container<C*> ,但出现此错误:

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

我应该如何声明该容器使用增强共享ptrs? 如果可能的话,我也希望它使用哑指针。


更新:从响应来看,似乎确实必须声明容器采用智能指针,而不能使容器同时采用智能或哑指针。 也就是说,从聪明到愚蠢,反之亦然。 那是对的吗?

这是一个使用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

为了使用向量,您需要明确指定它们将要持有的对象的类型,在您的情况下将为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>是一个智能指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM