2013-07-29 2 views
0

기본적으로 내가 원하는 것은 모든 데이터 형식을 저장할 수 있도록 클래스 내에 전역 변수 GLOBAL_WRAPPER_TYPE을 갖는 것입니다. 지금까지는 오류가있을 수있는 코드가 있지만 WRAPPED에서 아무것도 반환하지 않으려는 동안 컴파일됩니다.템플릿으로 중첩 된 클래스를 컴파일하려고합니까?

또한 내 설정 기능이 제대로 작동하는지 궁금하고 클래스에서 템플릿 유형 T를 검색하기 위해 = 연산자를 오버로드해야합니다. 나는 GLOBAL_WRAPPER_TYPE을 "추출"하는 데 어려움을 겪고 있었고 내부의 기능이 WRAPPED 클래스에서도 작동하는지 여부는 알 수 없습니다. 컴파일되지만 런타임 오류가 발생할 수 있습니다 (아직 실행하지 않았습니다).

나는 라인 (62) NODE temp = WRAPPING.INSIDE.get();

nested_class_global_template.cpp|44|error: invalid use of nonstatic data member 'WRAPPER<NODE>::GLOBAL_WRAPPER_TYPE'| 

때문에 ... 코드와 컴파일러 오류가 발생했지만 코드는 내가 set() 기능이 작동 단지 확실 해요, 그 선없이 컴파일 않습니다.

마지막으로 포인터로 선언 된 NODE*이 정적이 아닌 모든 것을 망칠 것이라고 생각하고 싶었습니다.

코드를 수정하십시오.

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

    T GLOBAL_WRAPPER_TYPE; 

    WRAPPER(){} 
    ~WRAPPER(){} 

    class WRAPPED 
    { 
     public: 

     WRAPPED(){} 
     ~WRAPPED(){} 
     void set(T GLOBAL_WRAPPER_TYPE) 
     { 
      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; 
}; 
int main() 
{ 
    WRAPPER<NODE> WRAPPING; 
    WRAPPING.INSIDE.set(NODE(99)); 


    NODE temp = WRAPPING.INSIDE.get(); 

    return 0; 
} 

이 하나가 작동 수정 됨!

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

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

답변

1

GLOBAL_WRAPPER_TYPEWRAPPER의 비 정적 멤버지만, 당신이 감싸에서 WRAPPER::GLOBAL_WRAPPER_TYPE을 반환 할 수 없습니다 그것은 WRAPPED의 일원이 아니다.

WRAPPER::GLOBAL_WRAPPER_TYPE을 정적으로 만들 수 있습니다.

참고 :

template <class T> 
class WRAPPER 
{ 
    public:  
    static T GLOBAL_WRAPPER_TYPE; 
    //...... 
}; 

template <class T> 
T WRAPPER<T>::GLOBAL_WRAPPER_TYPE; 

지금 당신이 WRAPPER에 액세스 할 수 있습니다 : 사용자 설정 기능을 사용하면 GLOBAL_WRAPPER_TYPE 정적 멤버를 만들 수있는, 자체 GLOBAL_WRAPPER_TYPE이 코멘트에서 WRAPPER::GLOBAL_WRAPPER_TYPE

void set(T GLOBAL_WRAPPER_TYPE) 
    { 
     GLOBAL_WRAPPER_TYPE = GLOBAL_WRAPPER_TYPE; // Doesn't do what you think!!! 
    } 

업데이트로 설정되지 설정 : GLOBAL_WRAPPER_TYPE.

void set(T GLOBAL_WRAPPER_TYPE) 
{ 
     WRAPPER::GLOBAL_WRAPPER_TYPE = GLOBAL_WRAPPER_TYPE; 
} 

참고 : 변수 이름은 읽기가 어렵고 더 나은 것을 더 잘 선택하십시오. 좋은 C++ 코딩 스타일을 찾으십시오. :)

+0

나는 네가 의미하는 바를 의심하고 있었다. 네가 생각하는 것을하지 않는다. 그것의 이상한'WRAPPED'는'GLOBAL_WRAPPER_TYPE'을 "볼"수 없습니다. "WRAPPED가 WRAPPER에 대한 참조를 보유하도록하자." – pandoragami

+0

WRAPPER와 WRAPPED는 두 개의 다른 클래스라고 생각하십시오. – billz

+0

WRAPPER를 WRAPPED로 선언 한 다음 GLOBAL_WRAPPER_TYPE을 (를) 호출합니까? – pandoragami

관련 문제