C++ C++;返回具有typename值的元组的模板
在我实现一个基于模板的链表的过程中,我想实现一个“C++ C++;返回具有typename值的元组的模板,c++,c++11,templates,tuples,typename,C++,C++11,Templates,Tuples,Typename,在我实现一个基于模板的链表的过程中,我想实现一个“popHead()”方法。然而,我无法编译它 /** * Removes the first element in the list and returns it. * @return first element, nullptr if list is empty */ std::tuple<K, V> popHead() { auto tmp = head; if (tmp) { if (tmp
popHead()
”方法。然而,我无法编译它
/**
* Removes the first element in the list and returns it.
* @return first element, nullptr if list is empty
*/
std::tuple<K, V> popHead() {
auto tmp = head;
if (tmp) {
if (tmp->next) {
head = tmp->next;
} else {
head = nullptr;
}
return new std::tuple(tmp->key, tmp->value);
}
return nullptr;
};
/**
*删除列表中的第一个元素并返回它。
*@return first元素,如果列表为空,则为null ptr
*/
std::tuple popHead(){
自动tmp=头部;
如果(tmp){
如果(tmp->next){
head=tmp->next;
}否则{
水头=零PTR;
}
返回新的std::tuple(tmp->key,tmp->value);
}
返回空ptr;
};
这不起作用,因为需要指定的类型。好的,所以它不知道元组包含的值应该是什么类型。。然而。。这也不起作用:
return new std::tuple<K, V>(tmp->key, tmp->value);
返回新的std::tuple(tmp->key,tmp->value);
如何返回类型为
的元组
return {tmp->key, tmp->value};
?
或者,您可能想要返回一个指向std::tuple
的指针
在这种情况下
return new std::tuple<K, V>(tmp->key, tmp->value);
返回新的std::tuple(tmp->key,tmp->value);
应该可以,但您必须修改返回类型
std::tuple<K, V> * popHead()
// --------------^ *pointer* to tuple
std::tuple*popHead()
//---------^*指向元组的指针*
也许吧
?
或者,您可能想要返回一个指向std::tuple
的指针
在这种情况下
return new std::tuple<K, V>(tmp->key, tmp->value);
返回新的std::tuple(tmp->key,tmp->value);
应该可以,但您必须修改返回类型
std::tuple<K, V> * popHead()
// --------------^ *pointer* to tuple
std::tuple*popHead()
//---------^*指向元组的指针*
类的接口指定popHead()具有此签名:std::tuple popHead()代码>。这可能意味着,如果列表为空,我返回nullptr的想法无论如何都不会起作用。我现在有点糊涂了。@octavio没有返回,您可以抛出或显示未定义behaviour@octavio-如果需要对象而不是指针,则不能返回nullptr
;我认为Caleth建议的解决方案(而不是return nullptr;
,抛出异常)非常合理。@max66是的,我现在抛出异常。thx的家伙们,应该给函数签名一个更好的外观。我现在让它工作了@octavio-再看看Caleth的另一个建议:如果(tmp->next){head=tmp->next;}else{head=nullptr;}
,你可以简单地编写head=tmp->next代码>,避免进行无用的测试。类的接口指定popHead()具有此签名:std::tuple popHead()代码>。这可能意味着,如果列表为空,我返回nullptr的想法无论如何都不会起作用。我现在有点糊涂了。@octavio没有返回,您可以抛出或显示未定义behaviour@octavio-如果需要对象而不是指针,则不能返回nullptr
;我认为Caleth建议的解决方案(而不是return nullptr;
,抛出异常)非常合理。@max66是的,我现在抛出异常。thx的家伙们,应该给函数签名一个更好的外观。我现在让它工作了@octavio-再看看Caleth的另一个建议:如果(tmp->next){head=tmp->next;}else{head=nullptr;}
,你可以简单地编写head=tmp->next代码>,避免一个无用的测试。吹毛求疵:if(tmp->next)代码>可以是head=tmp->next代码>,您没有取消对它的引用此问题令人困惑。您的原型显然返回了一个对象,但您试图返回nullptr
和new
的结果,这两个结果都是指针。popHead
是成员方法吗?这个班看起来像什么?你说的基于模板是什么意思?这是模板元编程类型吗?指针和模板元编程并不总是很好地结合在一起代码>可以是head=tmp->next代码>,您没有取消对它的引用此问题令人困惑。您的原型显然返回了一个对象,但您试图返回nullptr
和new
的结果,这两个结果都是指针。popHead
是成员方法吗?这个班看起来像什么?你说的基于模板是什么意思?这是模板元编程类型吗?指针和模板元编程并不总是很好地结合。