2017-11-16 7 views
0

키/값 쌍으로 작동하는 템플릿 기반 링크 된 목록을 구현하는 여정에서 "popHead()"메소드를 구현하고 싶습니다. 그러나 컴파일 할 수는 없습니다.typename 값을 가진 튜플을 반환하는 C++ 템플릿

/** 
* 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 new std::tuple<K, V>(tmp->key, tmp->value); 

어떻게 유형 <K, V>와 튜플을 반환합니까?

+2

Nitpick 수정해야합니다 :'경우 (tmp-> 다음)를 ...'단지가 될 수'머리 = tmp-> next;', 당신은 그것을 역 참조하지 않습니다 – Caleth

+1

이 질문은 혼란 스럽습니다. 프로토 타입은 분명히 객체를 리턴하지만, 당신은'nullptr'과 두 포인터 인'new'의 결과를 리턴하려고합니다. 'popHead'는 멤버 메소드인가요? 수업은 어떻게 생겼습니까? 템플릿 기반이란 무엇을 의미합니까? 이것은 템플릿 메타 프로그래밍 유형입니까? 포인터와 템플릿 메타 프로그래밍이 항상 잘 섞이는 것은 아닙니다. –

답변

2

어쩌면

return {tmp->key, tmp->value}; 

?

또는 포인터std::tuple<K, V>으로 보내시겠습니까? 이 경우

return new std::tuple<K, V>(tmp->key, tmp->value); 

에서

가 작동해야하지만 반환 형식을

std::tuple<K, V> * popHead() 
// --------------^ *pointer* to tuple 
+0

클래스의 인터페이스는이 서명을 갖기 위해 popHead()를 지정한다 :'std :: tuple popHead();'. 이것은 아마도 목록이 비어있는 경우 nullptr을 반환한다는 생각은 어쨌든 작동하지 않는다는 것을 의미합니다. 나는 지금 온화하게 혼란 스럽다. – octavio

+1

@octavio를 반환하는 대신에'throw'하거나 정의되지 않은 동작을 표시 할 수 있습니다. – Caleth

+0

@octavio - 포인터가 아닌 객체와 포인터가 필요하면'nullptr'을 반환 할 수 없습니다. Caleth ('return nullptr; 대신에, 예외를 던지기)가 제안한 해결책은 매우 합리적이라고 생각합니다. – max66