我有下面的小功能(你们中的一些人可能会要求我提供更多的代码但我不能出于多种原因)。我调用了pop_front()
函数,但编译器告诉我没有合适的构造函数将void
转换为shared_ptr<A>
。但是,当我离开时,我删除了括号(pop_front
)错误。那是什么? queue
的类型为deque
。对不起,如果我没有提供更多的代码。
std::shared_ptr<A> getSS() {
return queue.pop_front();
}
答案 0 :(得分:3)
首先,请阅读有关容器的队列:http://en.cppreference.com/w/cpp/container/queue的文档。
编译器告诉你的是相当直接的:pop_front()函数不返回front元素的值。它只是将其从容器中移除。要访问前面的元素,您需要使用访问函数front()
。
如果没有进一步的信息,我无法判断你删除括号后编译器没有抱怨的原因。我猜测的原因是你的A类共享指针与某个函数指针有某种兼容性,因为这就是你要返回的内容。
答案 1 :(得分:2)
请记住,您使用括号来调用方法或函数,如果没有它们,您将获得方法/函数地址。
当您返回queue.pop_front
时,您将返回方法的地址,而不是调用它,因此您可以构建它的shared_ptr。但是当你实际调用pop_front()
时,你会得到一个空白(因为pop_front返回void),并且......你无法从void中创建一个shared_ptr。
可能你想要:
... {
A result = queue.front();
queue.pop_front();
return result;
}
答案 2 :(得分:0)
Deque实际上代表双端队列。所以,你可以从两端推入它,也可以从两端弹出它。
插入函数的名称为:push_front()
和push_back()
以及删除功能的名称为:pop_front()
和pop_back()
,访问函数的名称为:front()
和back()
请注意,插入和删除函数不会返回任何内容。要从任何一端访问,您必须使用访问功能。
您可以看到参考here。
请参阅下面的示例更清楚:
#include<iostream>
#include<deque>
using namespace std;
int main()
{
deque<int>dq;
dq.push_front(23);
cout<<dq.front()<<" "<<dq.back()<<endl;
dq.push_back(33);
cout<<dq.front()<<" "<<dq.back()<<endl;
dq.push_front(43);
cout<<dq.front()<<" "<<dq.back()<<endl;
dq.pop_front();
cout<<dq.front()<<" "<<dq.back()<<endl;
dq.pop_front();
cout<<dq.front()<<" "<<dq.back()<<endl;
dq.pop_back();
return 0;
}