2013-01-06 2 views
3

포인터에 대한 참조 또는 포인터 참조 또는 호출 할 내용이 있지만 처음에는 일부 코드와 관련하여 질문이 있습니다. 첫째, 추상적 비교 함수 템플릿 클래스 :포인터 문제에 대한 참조

template <class T> struct BinaryTrivalent { 
    virtual BinaryTrivalent<T>* clone() const = 0; 
    virtual int operator()(const T& lhs, const T& rhs) const = 0; 
    int compare(const int a, const int b) const { 
     if (a < b) 
      return LESS_THAN; 
     else if(a == b) 
      return MATCH; 
     return MORE_THAN; 
    } 
}; 

그리고 그것의 실제 사용 :

struct NodePCompare : public BinaryTrivalent<Node*> { 
    NodePCompare* clone() const { return new NodePCompare(*this); } 
    int operator()(const Node*& lhs, const Node*& rhs) const { 
     return compare(lhs, rhs); 
    } 
}; 

템플릿 실제 유형에 잘 작동하지만 내가 그것을 예상대로 operator을 인식하지 않는 것 ~에 그리고 NodePCompare는 추상적이라고 말해줍니다.
저는이 문제를 과거에 접했지만 문제가 무엇인지 알아 내려고 포기하고 포인터를 다른 유형으로 감쌌습니다.
나는 지금 똑같은 일을 할 수 있었지만 진짜 문제가 무엇인지 이해하고 싶습니다.
나는이 문맥에서 정확히 *&이 무엇을 의미하는지에 대해 읽었으며, 정확하게 이해하지 못한다면이 이 잘 동작해야합니다.
이 링크는 조금 이해하는데 도움이되었습니다. http://markgodwin.blogspot.co.il/2009/08/c-reference-to-pointer.html

아이디어 누구?

+0

'NodePCompare'의'operator()'는'virtual'이어야합니다. –

+2

암시 적으로 가상입니다.'virtual' 키워드를 직접 기억할 수는 있지만 컴파일러에서는 필요하지 않습니다. – Jack

+0

@ 잭 : 맞아, 그걸 잊었다 –

답변

4

문제는 서명이 실제로 일치하지 않는다는 것입니다.

그것은이해야 다음 const가 적용 끝나는 곳

int operator()(Node* const & lhs, Node* const & rhs) const { 
    return compare(lhs, rhs); 
} 

문제입니다. 기본적으로

int operator()(const base_T_arg_t &lhs, const base_T_arg_t &rhs) const { 
    return compare(lhs, rhs); 
} 

에서, * 전에 const는 전체 포인터의 종류에 결합하지 않고, 그것을 : 당신은이 말을 한 다음 클래스의 민간 부분에 typedef Node * base_T_arg_t; 말에 의해 같은 일을 수행 할 수 형식은 Node입니다.

반환 유형 clone은 두 가지 이유로 인해 청어입니다. 첫째, 함수 시그니처에는 반환 유형이 포함되지 않습니다. 따라서 원래 서명과 일치하는 clone의 정의를 가장 명확하게 작성하고 있으므로이를 대체합니다.

그러나 반환 유형이 일치하지 않으면 컴파일러에서 일반적으로 오류가 발생합니다. 함수가 재정의 될 때 참조 또는 포인터 인 참조 유형 또는 파생 클래스에 대한 포인터 인 반환 유형을 허용하는 'contravariance'이라는 원칙이 있습니다.

결국 파생 된 유형에 대한 포인터는 기본 유형에 대한 포인터로 자유롭게 변환 가능합니다. 그것들은 어느 의미에서 동등합니다.

+0

우선, 고마워! 나는 그것을했다라고 생각한다! :) 둘째 :이 메모를 추가 할 기회가 오기 전에 답을 얻은 것 같습니다. 다시 감사합니다. – itchy23

+0

@ itchy23 : 환영합니다! – Omnifarious

+0

"붉은 청어"에 관해서는 : 나는 그 질문을 그냥 버려 두어야할까요, 아니면 제가 바로 그 일을하지 않는다고 설명하고 있습니까? 제 말은'operator()'가 문제 였고'clone()'이 아니라는 것을 언급했습니다. – itchy23