문제

몇 년 동안 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이 말한 내용 : 오류 메시지는 무엇입니까? 당신은 기능을 정의하고 선언했지만, 당신은 그 기능을 어디에서나 사용하지 않았으며, 오류를 보지도 않습니다 (오타 외에).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top