2011-03-03 3 views
1

나는 이것에 대해 몇 가지 연구를 해왔고 stackoverflow 형식에 대한 가시성에 대해 이야기하는 몇 가지 유사한 질문을 발견했지만 정확하게 동일한 문제 (또는 적어도 그것은 내가 그것에 대해 몇 시간을 보냈다 고 생각하는 것이다) 일 것이다.C++ 컴파일 : 오류 : 예상되는 생성자, 소멸자 또는 형식 변환 전에 '*'

하자 초점 :

문제

C++ 컴파일러 보고서 "abc.cpp : 132 : 오류 : '*'토큰 전에 예상 생성자, 소멸자, 또는 형식 변환"

문제가보고 된 코드

template <class C, class I> ABC<C, I>::Node * ABC<C, I>::buscaTreuIRetornaMinim(Node **node) { 
    if (*node == NULL) return NULL; 
    if ((*node)->fesq != NULL) return buscaTreuIRetornaMinim(&(*node)->fesq); 
    Node *q = *node; 
    *node = *node->fdre; 
    return q; 
} 

문제는 첫 번째 줄, 함수 헤더에보고됩니다. 지금까지 'Node *'를 지정할 때 문제가 있음을 이해하지만 이미 정규화되어 있으므로 어디서 문제가 발생하는지 알 수 없습니다.

한편 클래스 정의

class ABC { 
public: 
    ABC(void) : arrel(NULL), numelements(0), altura(0) { } 
    void inserir(C pclau, I pinfo); 
    void inordre(void); 
    I consultar(C pclau); 
    C minim(void); 
    C maxim(void); 
    void esborrar(C pclau); 

private: 
    class Node { 
    public: 
     C clau; 
     I info; 
     Node *fesq; 
     Node *fdre; 

     Node(C pclau, I pinfo, Node *pfesq = NULL, Node *pfdre = NULL) : clau(pclau), info(pinfo), fesq(pfesq), fdre(pfdre) { } 
    }; 

    Node *arrel; 
    Node *actual; 
    int numelements; 
    int altura; 

    void inserir(C pclau, I pinfo, Node **node); 
    void inordre(Node **node); 
    I consultar(C pclau, Node **node); 
    C minim(Node **node); 
    C maxim(Node **node); 
    void esborrar(C pclau, Node **node); 
    Node * buscaTreuIRetornaMinim(Node **node); 
}; 

의 나머지, 나는 기능의 나머지 부분은 완전한 기능입니다 보장 할 수 있습니다. 그것은 내가 지금까지 다뤘던 유일한 문제이다.

모든 팁을 크게 높이세요. 시간 내 주셔서 감사드립니다. 당신이 시도 유형을

을 노드입니다 인식 컴파일러를 도울 필요가 같은

답변

3

: typename ABC<C, I>::Node *

typename 키워드 here의 필요성에 대해 자세히 알아볼 수 있습니다.

+0

그게 다야! 나는 분명히 제안 된 문서를 살펴볼 것이다. 고마워요! – Sergio

2

가 보이는이 :

템플릿 매개 변수를 포함하는 형명은 키워드 typename로 시작해야
template <class C, class I> 
typename ABC<C, I>::Node* ABC<C, I>::buscaTreuIRetornaMinim(Node **node) 
{ 
    if(*node == NULL) return NULL; 
    if((*node)->fesq != NULL) return buscaTreuIRetornaMinim(&(*node)->fesq); 
    Node *q = *node; 
    *node = *node->fdre; 
    return q; 
} 
+0

Millianz에게 감사드립니다. Jason이 이전 의견에 제안한 내용과 동일합니다. 'typename'키워드를 추가 한 후 제대로 작동했습니다. – Sergio