간단한 템플릿 클래스의 "정의되지 않은 기호"링커 오류
-
14-09-2019 - |
문제
몇 년 동안 C ++에서 벗어 났으며 다음 코드에서 링커 오류를 받고 있습니다.
유전자 .H
#ifndef GENE_H_INCLUDED
#define GENE_H_INCLUDED
template <typename T>
class Gene {
public:
T getValue();
void setValue(T value);
void setRange(T min, T max);
private:
T value;
T minValue;
T maxValue;
};
#endif // GENE_H_INCLUDED
유전자 .cpp
#include "Gene.h"
template <typename T>
T Gene<T>::getValue() {
return this->value;
}
template <typename T>
void Gene<T>::setValue(T value) {
if(value >= this->minValue && value <= this->minValue) {
this->value = value;
}
}
template <typename T>
void Gene<T>::setRange(T min, T max) {
this->minValue = min;
this->maxValue = max;
}
코드 사용 :: 블록 및 GCC가 누구에게나 중요한 경우. 또한 재미와 연습을 위해 일부 GA 물건을 C ++로 명확하게 포팅합니다.
해결책
주어진 템플릿 클래스를 인스턴스화하기 전에 템플릿 정의 (코드의 CPP 파일)가 포함되어야하므로 헤더에 기능 정의를 포함 시키거나 클래스를 사용하기 전에 CPP 파일을 포함해야합니다 (또는 명시 적 수행 인스턴스화가 제한된 경우).
다른 팁
템플릿 클래스 기능의 구현이 포함 된 CPP 파일을 포함합니다. 그러나 IMHO, 이것은 이상하고 어색합니다. 반드시이 일을하는 더 매끄러운 방법이 있어야합니까?
몇 가지 다른 인스턴스 만 있으면 미리 알 수 있다면 "명시 적 인스턴스화"를 사용할 수 있습니다.
이것은 다음과 같이 작동합니다.
gene.cpp의 상단에는 다음 줄을 추가하십시오
template class Gene<int>;
template class Gene<float>;
~ 안에 if(value >= this->minValue && value <= this->minValue)
두번째 minValue
해야한다 maxValue
, 아니요?
echo Sean이 말한 내용 : 오류 메시지는 무엇입니까? 당신은 기능을 정의하고 선언했지만, 당신은 그 기능을 어디에서나 사용하지 않았으며, 오류를 보지도 않습니다 (오타 외에).
제휴하지 않습니다 StackOverflow