2013-07-29 5 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'| 

나는이 작업을 시도했지만 역시 동일한 오류가 발생합니다. 이것은 일반적으로 WRAPPED 클래스가 클래스 외부에 존재하지만 어떤 이유로 그와 같은 간단한 객체를 선언 할 수없는 경우 문제가되지 않습니다. C++ 컴파일러 의미론과 Stroustrup 신의 마법 세계를 통해 저를 계시하십시오. 코드를 heres.

#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 –