2013-07-29 45 views
2

我試圖聲明WRAPPED類型的對象在WRAPPED類中,WRAPPED類包含在另一個類WRAPPER中。我收到了這些編譯器錯誤。錯誤:在嵌套類中有不完整類型|:

nested_class_incomplete_type.cpp|56|instantiated from 'WRAPPER<NODE>'| 
nested_class_incomplete_type.cpp|62|instantiated from here| 
nested_class_incomplete_type.cpp|36|error: 'WRAPPER<T>::WRAPPED::WRAP' has incomplete type| 
nested_class_incomplete_type.cpp|33|error: declaration of 'class WRAPPER<NODE>::WRAPPED'| 

我也試過這樣做WRAPPER::WRAPPED WRAP;但這樣會產生相同的確切錯誤。如果WRAPPED類存在於類之外,這通常不會成爲問題,但由於某些原因,它不允許我聲明這樣一個簡單的對象。隨時可以啓發我對C++編譯器語義和Stroustrup之神的神奇世界的啓發。繼承人的代碼。

#include <iostream> 

using namespace std; 

class NODE 
{ 
     int data; 

    public: 

     NODE(){} 
     ~NODE(){} 
     NODE(int data) 
     { 
      this->data = data; 
     } 
     void print() 
     { 
      std::cout<<"data: "<<this->data<<std::endl; 
     } 
}; 
template <class T> 
class WRAPPER 
{ 
    public: 

     static T GLOBAL_WRAPPER_TYPE; 

    WRAPPER(){} 
    ~WRAPPER(){} 

     class WRAPPED 
     { 
      public: 

      WRAPPER::WRAPPED WRAP; 

      WRAPPED(){} 
      ~WRAPPED(){} 
      void set(T GLOBAL_WRAPPER_TYPE) 
      { 
       WRAPPER::GLOBAL_WRAPPER_TYPE = GLOBAL_WRAPPER_TYPE; 
      } 
      T& get() 
      { 
       return GLOBAL_WRAPPER_TYPE; 
      } 
      WRAPPED& operator=(const WRAPPED &INSIDE) 
      { 
       GLOBAL_WRAPPER_TYPE = INSIDE.GLOBAL_WRAPPER_TYPE; 

       return *this; 
      } 
     }; 

     WRAPPED INSIDE; 
}; 
template <class T> 
T WRAPPER<T>::GLOBAL_WRAPPER_TYPE; 
int main() 
{ 
    WRAPPER<NODE> WRAPPING; 
    WRAPPING.INSIDE.set(NODE(99)); 
    NODE temp = WRAPPING.INSIDE.get(); 
    temp.print(); 

    return 0; 
} 
+6

你的課程包含自己的一個實例。這意味着爲了創建該類型的變量,您需要創建該類型的變量,因此您必須創建該類型的變量......得到它? ;) – Borgleader

+0

我明白了,但我仍然看不出如何解決這個問題。 – pandoragami

+1

您需要將其作爲參考或指針。你無法控制自己,這將會造成無限大的類型。 – Borgleader

回答

7

基本上你想要做的是:

class A 
{ 
    A a; 
}; 

int main() 
{ 
    A a; 
    return 0; 
} 

(你可以看到,這將產生同樣的錯誤here

這是無限遞歸,你定義一個鍵入使用它自己。拿一個指針來代替,如下所示:

class A 
{ 
    A* a; 
}; 

int main() 
{ 
    A a; 

    return 0; 
} 

正如你可以看到here這個編譯。

+0

Compilo ergo shippo –

相關問題