2011-10-23 7 views
0

회원 포인터 오류를 역 참조 : 회원 포인터로 사용할 수 없습니다

다음과 같은 (잘린) 클래스 선언이 있습니다 :

template <typename T> 
class btree 
{ 
    public: 

     btree(const btree<T>& original); //This is btree's copy constructor 

    private: 

     struct btree_node 
     { 
      btree_node(const btree_node &other) 
      { 
       //This is node's copy constructor 
      } 
     } 

     btree_node* headNode; 
} 

그리고 btree의 복사 생성자는 다음과 같이 구현됩니다 :

template <typename T> 
btree<T>::btree(const btree<T>& original) 
{ 
    headNode = new btree_node(original.*headNode); 
} 

original. * headNode는 원래 btree_node를 반환합니다. headNode가 가리키고 있으므로 btree_node의 복사 생성자 인수가 일치합니다.

그러나 다음과 같은 오류가 발생합니다.

error: '((btree*)this)->btree::headNode' cannot be used as a member pointer, since it is of type 'btree::btree_node*'

무엇을 잘못하고 있습니까?

답변

3

당신이 보는 경우는 precedence table 당신은 먼저 . 운영자가 평가 한 후 * (역 참조를 볼 수 있습니다) 연산자가 평가됩니다.

*은 인수로 포인터를 취합니다. original.*headNode으로 작성하면 의미가 없습니다. 어떻게 든 회원 *headNodeoriginal이 되라고 말하고 있지만 *headNodeoriginal의 회원이 아닙니다. 또한 실제로 *this->headNode*headNode을 평가한다고 말하고 있습니다 (->이 먼저 평가됨에 유의하십시오).

원하는 것은 먼저 original.headNode을 작성하여 포인터를 얻은 다음 *을 사용하여 역 참조하십시오. 따라서

*original.headNode 
+0

감사합니다. – Arvin

5

이 시도 :

headNode = new btree_node(*(original.headNode)) 
+0

아 .. 당연히 고마워요, 그거야 – Arvin

2

내가 당신이 원하는 것은 실제로 가정

headNode = new btree_node(*original.headNode); 
+0

그래, 내가 원했던 것! 어리석은 실수. 감사! 나는 * original.headNode를 수행했다면 포인터가 아니고 따라서 의미가없는 원본을 역 참조하는 것이라고 생각했습니다 – Arvin