在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&’
我应该如何声明使用boost共享文件的容器?如果可能的话,我希望它也接受哑指针。
UPDATE:从响应来看,似乎容器确实必须声明为接受智能指针,不能同时接受智能指针和非智能指针。也就是说,不存在从聪明到愚蠢或反之的强制。对吗?
下面是一个使用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;
上面的操作创建了一个vector,用于存储指向foo的共享指针。
那么当你有一个这样的共享指针
boost::shared_ptr<foo> foo_ptr(new foo());
你可以这样做
vec.push_back(foo_ptr)
当你需要哑指针时,你可以这样做
foo* f = vec[0].get();
我读了你的更新,你说
…看来这个集装箱确实必须申报携带智能物品指针,它既不能接受智能指针也不能接受愚蠢指针。
你应该明白boost::shared_ptr<Type>
是一个智能指针
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 优先顺序:智能指针和类析构函数
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 智能指针作为无序映射键,并通过引用进行比较
- 智能指针概念所有权和寿命
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- 尝试使用智能指针时引发异常
- 我可以制作指向智能指针的智能指针吗?
- 通过智能指针和转换对基本模板参数进行模板推导
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 从堆栈分配的原始指针构造智能指针
- 初始化指向类实例的智能指针并访问其方法
- 如何使用 std::make_shared 创建基类类型的智能指针?
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 编译器不会使用 -std=c++11 编译智能指针
- 具有智能指针的多态性
- C++:矢量分配器行为、内存分配和智能指针
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 指向函数签名中的常量智能指针
- 使用智能指针附加的继承对象的深层复制