2017-11-02 4 views
-2
template <class T> 
struct stkNode 
{ 
    BinTreeNode<T> *ptr; 
    enum tag {R,L}tag; 
    stkNode(BinTreeNode<T> *N = NULL) : ptr(N),tag(L){} 
}; 

template<class T> 
void BinaryTree<T>::PostOrder(void(*visit)(BinTreeNode<T> *p)) 
{ 
    SeqStack<stkNode<T> > S; 
    stkNode<T> w; 
    BinTreeNode<T> *p = root; 
    do 
    { 
     while (p != NULL) 
     { 
      w.ptr = p; 
      w.tag = w.L; 
      S.Push(w); 
      p = p->leftChild; 
     } 

     bool continuel = true; 
     while (!S.IsEmpty() && continuel) 
     { 
      S.Pop(w); 
      p = w.ptr; 

      switch (w.tag) 
      { 
      case w.L: //---------------this line-------------------------- 
       w.tag = w.R; 
       S.Push(w); 
       continuel = false; 
       p = p->rightChild; 
       break; 
      case w.R: // -----------and this line------------- 
       visit(p); 
       break; 
      } 
     } 
    } while (!S.IsEmpty()); 
} 

DevC++でコンパイルすると、エラーになります: [エラー] '。'定数式には現れません。 しかし、Visual Studio 2015でコンパイルするとエラーは発生しません。 なぜ??????'。'定数式には現れません

-----------だった な

#include <iostream> 
using namespace std; 

struct exp 
{ 
    char ch; 
    enum dir{ 
     L,R 
    }direction; 
    exp(char name,dir d){ 
     ch = name; 
     direction = d; 
    } 
}; 
int main() 
{ 
    exp t('a',exp.L); //this line 
    return 0; 
} 

として--------------------私の問題を更新同じ

+0

このコードは不完全であり、すべてでコンパイルされません。 [mcve]を作成してください。 – Johan

+0

さて、私はそれを更新しました。 –

+0

2番目の例は異なり、範囲演算子 'exp :: L'を使って修正することができます。最初のケースでは、ドットの左側に変数があり、2番目のケースではタイプです。 –

答えて

0

問題は、私が誤って列挙型のメソッドにアクセスすることです.... 右のコードは次のとおりです。

template<class T> 
void BinaryTree<T>::PostOrder(void(*visit)(BinTreeNode<T> *p)) 
{ 
    SeqStack<stkNode<T> > S; 
    stkNode<T> w; 
    BinTreeNode<T> *p = root; 
    do 
    { 
     while (p != NULL) 
     { 
      w.ptr = p; 
      w.tag = w.L; 
      S.Push(w); 
      p = p->leftChild; 
     } 

     bool continuel = true; 
     while (!S.IsEmpty() && continuel) 
     { 
      S.Pop(w); 
      p = w.ptr; 
      switch (w.Tag) 
      { 
      case stkNode<T>::L: 
       w.tag = w.R; 
       S.Push(w); 
       continuel = false; 
       p = p->rightChild; 
       break; 
      case stkNode<T>::R: 
       visit(p); 
       break; 
      } 
     } 
    } while (!S.IsEmpty()); 
} 
+0

サイドノード:あなたの質問に 'C++ 11'タグを付けました。あなたのコードに非C++ 11がいくつかあります。例:旧式の関数ポインタ( 'std :: function *)')の代わりに '' nullptr'の代わりに '' NULL''を使います。 – Darhuuk

+0

あなたは 'case stkNode :: L:'の代わりに 'decltype()'を使うことができるようにC++ 11にタグを付けました。 'case decltype(w):: L'を使うことができます。それは同じことですが、ある状況では(IMHO)、読めるように明確にすることができます。 – max66