查看以下代码段。
#typedef std::shared_ptr<node> node_ptr;
std::vector<node_ptr> temp;
for(int i=0; i<4; i++)
{
temp.push_back(&m_nodes.at(n[i]-1)) // Got error in this line
}
m_nodes
被定义为节点对象的向量。
std::vector<node> m_node;
当我评估此代码时,出现以下错误:
error: no matching function for call to 'std::vector<std::shared_ptr<node> >::push_back(__gnu_cxx::__alloc_traits<std::allocator<node> >::value_type*)'
temp.push_back(&m_nodes.at(n[i]-1));
^
我对指针的了解有限,我无法弄清楚错误。请帮忙
修改
从下面给出的答案和谷歌搜索中,我得出结论,指针向量是一个坏主意。但在我的情况下,只有必要使我使用指针向量。我使用C ++进行科学计算,节点对象包含我需要计算的变量。由于节点对象的数量很大,因此每次都难以复制和移动。因此,为了传递函数和初始化其他类对象,我需要使用指向节点或引用的指针
如果shared_ptr
在我的上下文中是错误的选择,还有其他简单有效的方法吗?由于我是C ++的初学者,我更喜欢一个简单的解决方案。
答案 0 :(得分:2)
接受Y*
的{{3}}为explicit
。它不会作为用户定义的转换参与将原始指针转换为shared_ptr
。并且temp.push_back
没有重载以接受原始指针。因此你的错误。
您可能使编译时错误消失,但当shared_ptr
中的temp
开始调用delete
时,您的程序将显示未定义的行为} m_nodes
拥有的对象。
使用宏是非常可怕的。使用类型别名:
using node_ptr = std::shared_ptr<node>;
因为您似乎需要非拥有指针(shared_ptr
用于复杂的所有权语义)。传递一个原始指针向量是完全没错的。在您的情况下,只需将类型别名设为:
using node_ptr = node*;
这将在不重写整个代码的情况下正确更改语义。
答案 1 :(得分:0)
你不能push_back
指向智能指针向量的指针,你应该使用emplace_back()
代替地构建一个共享指针:
// this will create a new shared_ptr in-place, and will call the appropriate constructor for it.
temp.emplace_back(&m_nodes.at(n[i]-1));
此外,您应该使用typedef而不是宏:
typedef std::shared_ptr<node> node_ptr;
// or, better yet:
using node_ptr = std::shared_ptr<node>