2010-03-27 4 views
5

문제가 발생했습니다. 매우 구체적인 것으로 생각됩니다.가상 메서드 및 템플릿 클래스

나는이 수업하는 B aseclass과 (B aseclass에서)를 D erived 클래스를 가지고있다. B 템플릿 클래스 (또는 클래스 템플릿)이고 D erived 등급이 다시 구현하는데되는 순수 가상 메소드virtual void work(const T &dummy) = 0; 이 있지만 D로B보다는 D에서 유래이 또 다른 템플릿 클래스 인 경우 컴파일러는 가상 함수와 템플릿이 즉시 작동하지 않는다고 나에게 말합니다.

아이디어를 얻고 싶습니다.

난 당신이 allready이 클래스는 AS IS 일명 고정

, 나는 기존 코드 기반을 파괴하지 않고 편집 할 수 없습니다

그 문제를했다 특히, 어떤 생각과 아이디어에 대한 thankfull 오전

template <typename T> 
class B { 
public: 
... 
virtual void work(const T &dummy) = 0; 
.. 
}; 

예를 들어

class D : public B<int*>{ 
... 
virtual void work(const int* &dummy){ /* put work code here */ } 
.. 
}; 

편집 INT *을 : 컴파일러는 나에게 말한다, void B<T>::work(const T&)[with T = int*]페이지입니다 가상 가상 이내

+0

이 (Qt는 클래스와이 시도로) 여전히 나를 위해 작동하지 않는 이유를 여기 읽기, Qt는 디자인 단점 ... http://lists.trolltech.com/qt-interest/2006을 -02/thread00693-0.html – drahnr

+0

및 여기를 참조하십시오 http://doc.trolltech.com/qq/qq15-academic.html 결국 나는 템플릿 대신 오래된 악의적 인 void *를 사용해야합니다 ... – drahnr

답변

9

const를 잘못된 위치에 두었습니다. 즉 그것은 INT 아니라 포인터와 연관 CONST,

virtual void work(int* const &dummy){ /* put work code here */ } 

const int*int const*는 동일하다보십시오.

1

시도 :

int* const& dummy 
+0

정말 중요합니다. 나는 C++을 배웠던 이래로 위와 같았습니다. 아무도 지금까지 불평하지 않았습니다 ... 지금까지 ... const에 대한 문서와 모범 사례가 있습니까? – drahnr

+4

"const 포인터 int"와 "const int 포인터"의 차이점입니다. –

+0

추가 : const가 왼쪽에 바인딩되지 않은 경우를 제외하고는 오른쪽에 바인딩됩니다 (즉, 가장 일반적인 용도) – drahnr

0

컴파일러?

g ++ 4.4에 대해 불평하지 않았다

template <typename T> 
class B { 
public: 
virtual void work(const T &dummy) = 0; 
}; 
class D : public B<int*>{ 
virtual void work(const int* &dummy){ /* put work code here */ } 
}; 

int main(){return 0;} 

편집 : 물론 - 오류가 실제로 const 키워드를 이동하여 고정, D를 인스턴스화 할 때 나타났다 : 당신은이

template <typename T> 
class B { 
public: 
virtual void work(const T &dummy) = 0; 
}; 
class D : public B<int*>{ 
virtual void work(int* const &dummy){ /* put work code here */ } 
}; 

int main(){D d;return 0;} 
+2

@Douglas 템플릿을 사용하지 않았기 때문에. –

0

을 상수와 참조 문제가 섞여있다. 다음 컴파일 :

template <typename T> 
struct B { 
virtual void work(T dummy) = 0; 
}; 

struct D : public B<int*>{ 
virtual void work(int* dummy){ /* put work code here */ } 
}; 

int main() { 
    D d; 
    d.work(0); 
}