템플릿 기능이 다른 템플릿 기능을 상속하는 설치가 있습니다.템플릿 기능의 재 선언 오류
template <typename DataType>
class ClassBase
{
virtual void InitModel(const cv::Mat& data) {};
}
template <typename DataType>
class ClassDerived : public ClassBase<DataType>
{
void InitModel(const cv::Mat& data) {};
}
지금 내가 쓴 전에, 내가 어떤 전문화를 가지고 있지 않았고 그것을 잘 작동했다
template<>
void ClassDerived<float>::InitModel(const cv::Mat& data)
{
// initialize some things
}
template<>
void ClassDervied<cv::Vec3b>::InitModel(const cv::Mat& data)
{
// initialize some things
}
template<typename DataType>
void ClassDerived<DataType>::InitModel(const cv::Mat& data)
{
// initialize some things
}
구현 파일에 두 개의 전문과 ClassDerived에 InitModel로 하나 일반적으로 템플릿을 구현하려고합니다. 특수화 기능을 추가하자마자 스펙 기능을 다시 선언했음을 알리는 오류가 발생합니다. 이상한 부분은 재 선언이 같은 행 번호를 가리킨다는 것입니다. 동일한 파일에 있습니다. 특수화되기 전에 정상적으로 작동 했으므로 파일을 두 번 읽지 않을 것으로 예상됩니다.
그래서 특수화가 추가되는 즉시 왜 그런 오류가 나타나기 시작합니까?
오류 :
/other/workspace/perception/perception_kit/object_detection/include/perception_kit/object_detection/grimson_GMM_templated_impl.tpp:129 : 의 여러 정의`perception_kit :: GrimsonGMMGen :: InitModel로 (CV : 매트 const를 &) ' CMakeFiles/test_obj.dir/SRC/object_detection_templated_test_platform.cpp.o : /other/workspace/perception/perception_kit/object_detection/include/perception_kit/object_detection/grimson_GMM_templated_impl.tpp : 129 : 먼저 정의를 여기
템플릿 기반 클래스 또는 다른 것을 파생하려고하기 때문에 문제가 있습니까?
나는 그것이 사소한 문제 일지 모르지만 나는 여기에 게시하기 전에 상당한 시간을 보냈다.
베이스 클래스 BaseClass.h (그것의 추상 클래스로서 구현) 파생 클래스 선언 DerivedClass.h 에 인 파생 클래스 선언 DerivedClass.tpp이고
이 ClassDerived <떠 :: InitModel로'에서 누락 된 꺾쇠 괄호가 '오타가?(btw, 명시 적 전문화가 아니면 클래스 템플릿의 멤버 함수 정의가 헤더 파일에 속해야합니다.) –
템플릿 정의 및 구현을 두 개의 다른 파일로 분할합니까? – andre
네, 이건 쓸 것이 많았습니다. 오타입니다. 정의는 .h이며 선언은 .hpp에 포함 된 .tpp에 있습니다. – navderm