Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;返回具有typename值的元组的模板_C++_C++11_Templates_Tuples_Typename - Fatal编程技术网

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
是成员方法吗?这个班看起来像什么?你说的基于模板是什么意思?这是模板元编程类型吗?指针和模板元编程并不总是很好地结合。