2013-07-09 1 views
1

내가 만든 목록 데이터 형식을 가져 와서 템플릿으로 사용하려고합니다. 그렇게함으로써 나는 다음과 같은 애매한 문제를 겪었다. 필요한 경우 모든 코드를 게시 할 수 있지만 실제로 문제를 일으키는 함수입니다.비정상적인 오류 : ')'토큰 앞에 비정규 화 된 ID가 있어야합니다.

참고 :이 코드는이 방법을 사용할 때까지 컴파일되었습니다. 나는 모든 라인을 온전한 체크로 써서 컴파일하고 있었는데 모든 것이 좋았지 만이 시점에 도달하면 폭발한다. try/catch 블록을이 메소드 밖으로 가져 가면 잘 컴파일되므로 문제가 헤더에서 누락되지 않았 음을 확신 할 수 있습니다. 다른 답변에서보고 된대로 - 물론 나는 트리플 체크를 확실히했습니다! :)

여기에 문제의 원인이되는 코드입니다 : 내가 말했듯이 여전히 오류를 유발하면서

template<class T> 
bool UnsortedListType<T>::IsFull() 
{ 
    try { return false; } 
    catch(std::bad_alloc exception) { return true; } // line 35 
} 

, 나는 가능한 한 많이 단순화. 다음은 오류입니다 :이 오류에서 찾을 수

UnsortedListType.cpp||In member function 'bool UnsortedListType<T>::IsFull()': 
UnsortedListType.cpp|35|error: expected type-specifier 
UnsortedListType.cpp|35|error: expected unqualified-id before 'exception' 
UnsortedListType.cpp|35|error: expected ')' before 'exception' 
UnsortedListType.cpp|35|error: expected '{' before 'exception' 
UnsortedListType.cpp|35|error: 'exception' was not declared in this scope 
UnsortedListType.cpp|35|error: expected ';' before ')' token 

모든 문제가 머리글 또는이 파일 중 하나를 추가 세미콜론 또는 누락 된 세미콜론 중 하나를 말합니다. 나도 그 중 하나의 인스턴스를 찾을 수 없습니다. try/catch 블록을 제거하면 잘 컴파일됩니다.

내가 int를 잡으면 플러스, 그것은 잘 컴파일 :

template<class T> 
bool UnsortedListType<T>::IsFull() 
{ 
    try { return false; } 
    catch(int exception) { return true; } 
} 

는 또한 잡을 수 있습니다 (INT)과는 잘 컴파일,하지만 난 잡으려고 시도하는 경우 (표준 :: bad_alloc 뿐이다) (예 : "예외"변수 이름이없는 경우) 위에 나열된 것과 같은 오류가 발생합니다. 단순히 catch (std :: exception)하려고해도 컴파일이 실패합니다.

그래서 지금 나는 엉망입니다. 나는 C + +에서 어떤 전문가에 의해 스트레칭이 클래스에 대한, 그리고 난이 오류를 극복하는 방법을 잘 모르겠습니다.

덧붙여, 여기에 또한 잘 컴파일이 아닌 일반 버전에서 코드, 그리고 (사람이 궁금해하는 경우, 데일를) 내가 사용 교과서에서 그대로입니다 : 내가 사용하고

bool UnsortedListType::IsFull() const 
{ 
    NodeType* location; 
    try 
    { 
     location = new NodeType; 
     delete location; 
     return false; 
    } 
    catch (std::bad_alloc exception) 
    { 
     return true; 
    } 
} 

CodeBlocks 12.11 Windows 7에 내장 된 GNU 컴파일러 IDE.

도움을 주시면 더 많은 도움을 드리며 요청이 있으면 더 많은 코드를 게시 해 드리겠습니다. 페이지를 채우고 싶지 않습니다.

미리 감사드립니다.

추 신 : 나는 숙제를하고 있지만, 숙제는 내가 템플릿을 만들 것을 요구하지 않는다. 나는 그 길을 나 자신으로 선택하고있다. 관련성이 있는지 확실하지 않지만 C++ 템플릿을 처음 사용하기 때문에 저것을 그냥 던지십시오.

+1

참조로 예외를 잡습니다. – chris

+0

당신은'#include ' –

+5

사실, #include '이 필요하다고 생각합니다. 그리고 네, const 참조에 의해 예외를 잡는 것이 좋습니다 :'catch (const std :: bad_alloc & exception)'. – jogojapan

답변

3

std::bad_alloc은 헤더 <new>에 정의되어 있으므로 포함시켜야합니다.

또한 참조로 예외를 잡는 것이 좋습니다. 값을 캐치하면 (자), 예외 오브젝트의 카피 (아마 슬라이스)가 발생합니다. 개인적으로 비 const 레퍼런스를 습관화하여 처리하는 동안 예외 상태를 추가 할 수 있지만 대부분의 기본 예외 유형은 무 상태이므로 const &과 비 const & 사이에는 실제적인 차이점이 없습니다.

+0

"얇은 복사본"이란 무엇을 의미합니까? – Dave

+0

@Dave 기본 클래스의 객체 (예 :'std :: exception')를 파생 클래스의 인스턴스에서 초기화하면 복사 생성자가 원본의 기본 하위 객체에서 사용됩니다. 이는 기본 클래스 구현을 놀라게 할 수 있으며 어떤 경우에는 정보를 잃어 버리게됩니다. 그 효과를 "조각"이라고합니다. – Potatoswatter

+0

흥미 롭다 나는 그것을 몰랐다, 고마워! – Dave

관련 문제