2011-03-03 164 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前綴:typename ABC<C, I>::Node *

你可以閱讀更多關於typename關鍵字here的必要性。

+0

就是這樣!我肯定會看看建議的文檔。非常感謝你! – Sergio 2011-03-03 02:17:14

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

謝謝Millianz,這與Jason在前面的評論中提出的建議是一樣的。在添加'typename'關鍵字後,它工作正常。 – Sergio 2011-03-03 02:18:35

相關問題