2013-05-21 5 views
1

Noob 질문은 여기에 있습니다. 순환 종속성이있는 클래스가 있으므로이를 선언했습니다. 이제이 템플릿을 사용해 볼 계획입니다. 앞으로 선언 된 클래스가있는 템플릿 함수

class C; 
    class A { 
    public: 
     virtual void foo(C *c); 

    template <class T>  
     void changeProperty(C *c, string& s) { 
      void* obj = c->getMap()->at(s); // does not compile 
      // (did not include the rest for brevity) 
     } 
    } 

이이 줄에서 컴파일에 실패 A.h

에서
class C { 
public: 
    virtual void getMap(); 
} 

// C.h

에서

// 함수 '하여 getMap()를'하지 않는 클래스 C를 알리는 지정된. 이 문제를 해결할 수 있습니까? 그렇다면 어떻게?

+0

이 당신이 헤더 파일에 함수를 정의하지만 그것이 내가 생각했던 소스 파일 (cpp를) – Xale

+0

에서 할 수없는 이유입니다 :

그래서 전처리 결과는 같은 무언가로 끝날 것 템플릿 함수가 다르고 헤더에 정의되어야했습니다. 그것이 대부분의 사례에서 보여준 것입니다. 나는 그것이 틀렸다고 생각한다. –

+1

예 sry. 다른 파일에 소스를 가질 수 없습니다. 그러나 헤더에서 더 자세히 정의 할 수 있습니다. – Xale

답변

3

changeProperty의 정의를 이동하여 (inline이 아니므로) class C의 정의를 본 후 어딘가에 배치하십시오.

class C; 
class A { 
public: 
    virtual void foo(C *c); 

template <class T>  
    void changeProperty(C *c, string& s); 
} 

// ... 

class C { 
public: 
    virtual void getMap(); 
} 

// ... 

template <class T>  
    void A::changeProperty(C *c, string& s) 
    { 
     void* obj = c->getMap()->at(s); // compiles 
     // (did not include the rest for brevity) 
    } 
+0

고마워,이 작품! –

+0

@PeterWood, 순환 종속성 문제와 관련이 없으므로 OP의 예에서 의도하지 않은 입력 오류라고 가정합시다. 그렇지 않다면 우리는 'C'가'A'를 언급하지 않았기 때문에 순환 참조가 없다는 것을 지적 하겠지만, 나는 OP의 실제 코드에서 –