Компиляция c ++: ошибка: ожидаемый конструктор, деструктор или преобразование типов перед '*' - PullRequest
1 голос
/ 03 марта 2011

Я провел некоторое исследование по этому поводу и обнаружил несколько похожих вопросов о стековом потоке, говорящих о видимости типов, но, похоже, это не совсем та же проблема (или, по крайней мере, я так думаю через несколько часовработаем над этим).

Давайте сосредоточимся:

Проблема

Отчеты компилятора C ++ "abc.cpp: 132: ошибка: ожидаемый конструктор, деструкторили преобразование типа перед '*' token "

Код, в котором сообщается о проблеме

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);
};

С другой стороны, я могу убедиться, что остальные функции полностью работоспособны.Это единственная проблема, с которой я до сих пор сталкивался.

Любая подсказка будет принята с благодарностью.Заранее спасибо за ваше время.

Ответы [ 2 ]

3 голосов
/ 03 марта 2011

К квалифицированному имени типа, включающему параметры шаблона, должен предшествовать ключевое слово typename: typename ABC<C, I>::Node *

Подробнее о необходимости этого typename ключевого слова можно узнать здесь .

2 голосов
/ 03 марта 2011

Похоже, вам нужно помочь компилятору, распознающему тип Node

Попробуйте:

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; 
}
...