2013-07-05 4 views
0

에서 비 템플릿 클래스를 파생 할 때 :문제는 C에서 템플릿 클래스 ++ 나는 내 코드는 다음과 같다</p> <p>필요 마녀 유형을 지정 템플릿 클래스의 비 템플릿 클래스를 상속하기 위해 노력하고있어

기본 클래스 (업데이트)에 대한 헤더 파일을

//base.hpp 
template<typename T> 
class Base { 
public: 
    Base(T a,int b) : 
      aa(b) { 
     this->bb = a; 
     // ... some code 
    } 
    // .. some functions (all are NOT virtual) 
protected: 
    const int aa; 
    T bb; 
    // .. some non-constant variables 
} 

파생 클래스 헤더 코드 :

//derived.hpp 
#include <SFML/System.hpp> 
#iclude "base.hpp" 

class Derived: public Base<sf::Vector2i> { 
public: 
    Derived(float, int, Vector2i); 
    // .. other methods 
protected: 
    // .. other variables 
} 

//derived.cpp 
#include "derived.hpp" 

Derived::Derived(float initf, int myint, Vector2i vec) : 
     Base(vec, myint) { 
    // ... some codes 
} 

"sf"는 SFML 라이브러리 작업에 대한 네임 팩을 참조합니다. 나는 cmake를 사용하여 소스에서 컴파일 된 것을 SFML 2.0을 사용하고

(자세한 내용은 당신이 볼 수 : http://www.sfml-dev.org/를)

$ g++ ./main.cpp ./derived.cpp ./base.cpp -lsfml-system 

나는이 유사한 명령을 사용하여이 코드를 컴파일하려고

In function `Derived::Derived(float, int, sf::Vector2<int>)': 
undefined reference to `Base<sf::Vector2<int> >::Base(sf::Vector2<int>, int)' 

이 또한 내가 사용할 C++ (11) 내 C++ 컴파일러로 "g ++ (우분투/리나 4.7.3-1ubuntu1) 4.7.3"을 사용하고 있습니다 :

내가 말할 일부 링커 오류가 발생합니다.

+0

수천 개의 중복 파일 ... base.cpp 파일을 제거하십시오. –

+0

@ kerrek-sb : 아니요! 그게 내 문제가 아니야. 내 메소드를 인라인으로 만들거나 클래스 정의에 포함시킬 때 여전히 문제가 있습니다. – ARF

+2

차고에 차가 있는데, 시작되지 않습니다. 나는 정비공에게 물어 보았고 그에게 증상을 말했다. 나는 열쇠를 돌렸고 아무 일도 일어나지 않았다. * 아마 배터리 일 겁니다. 그래서 저는 배터리를 사서 그것을 설치했습니다. 키를 돌렸고 엔진이 시동을 걸지 않습니다. 후드 아래에 엔진이 없어도 관련이있을 수 있습니다. 그건 내가 배터리가 필요 없다는 것을 의미하지는 않습니다 (나는 배터리가 필요 없습니다!), 그것은 단지 내 차에 다른 문제가있을 수 있음을 의미합니다. –

답변

1

컴파일러에서 원하는 경우의 99.9 %를 템플릿에 암시 적으로 인스턴스화하려면 컴파일러에서 멤버 정의를 확인해야합니다. Base 생성자의 정의를 헤더로 이동하면 문제가 해결됩니다.

+0

@ david-rodriguez-dribeas : 링커가 여전히 오류를 알려줍니다 – ARF

+0

@ARF : 무슨 오류입니까? –

+0

@ david-rodriguez-dribeas : 같은 오류! – ARF