1

私はこれについていくつかの調査を行っており、タイプの可視性について話しているスタックオーバーフローに関するいくつかの同様の質問を見つけましたが、これはまったく同じ問題ではないようです(または少なくともそれは私がそれに取り組んだ数時間後に私が思うことです)。

焦点を当てましょう:

問題

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

この問題は、最初の行である関数ヘッダーで報告されます。これまでのところ、問題は「ノード*」を指定するときであると理解していますが、すでに完全に修飾されているため、どこに問題があるのか​​わかりません。

クラス定義の残りの部分

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

一方、残りの機能が完全に機能していることを確認できます。それが私がこれまで扱ってきた唯一の問題です。

どんなヒントでも大歓迎です。よろしくお願いします。

4

2 に答える 2

4

テンプレートパラメータを含む修飾型名には、キーワードのプレフィックスを付ける必要がありますtypenametypename ABC<C, I>::Node *

typenameこのキーワードの必要性について詳しくは、こちらをご覧ください。

于 2011-03-03T01:57:15.947 に答える
2

ノードがタイプであることをコンパイラが認識するのを助ける必要があるようです

これを試して:

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; 
}
于 2011-03-03T01:55:29.690 に答える