2013-03-30 4 views
0

템플릿 및 정적 멤버를 사용하여 몇 가지 아이디어를 구현하고 있습니다. "진짜"코드가 다른 오류가 발생하지만, 이것은 내가 여전히 장난감 예 링커 오류와 code템플릿 및 정적 객체

#include <string> 
#include <iostream> 

template<int dim> 
class Class1 { 
    public: 
    Class1() {}; 
    ~Class1() {}; 
    void foo() { 
     std::cout<<"foo-1"<<std::endl; 
    } 
    protected: 
    std::string name; 
}; 

template<int dim> 
class Class2 : public Class1<dim> 
{ 
    public: 
    Class2(const int & a, const int &b) : 
     number(Class2<dim>::id_generator++) 
    { 
     Class1<dim>::name = "My-name"; 
     foo(); // (1) 
     }; 

void foo() { 
    Class1<dim>::foo(); 
    std::cout<<"foo-2"<<std::endl; 
} 

private: 
    const unsigned int number; 
    static unsigned int id_generator; 
}; 

int main() 
{ 
    int a = 1, b=2; 
    Class2<2> class2(a,b); // (2) 
} 

에있는 하나입니다

undefined reference to `Class2<2>::id_generator' 

것이란 삶의 예는이 오류를 발생

(1) required from 'Class2<dim>::Class2(int, int) [with int dim = 3]' 
(2) required from here. 

실생활의 오류는 전혀 전혀 알려주지 않습니다! : 만약 장난감 문제가 풀리면 현실 세계도 사라질 것입니다. 그러나 구조의 문맥에서 "실생활"오류 (그 두 줄)에 대한 아이디어가 있다면, PLS 알려

+2

가능한 중복 [C++ : 정적 클래스 멤버에 정의되지 않은 참조 (http://stackoverflow.com/questions/272900/ 그러나 템플릿 코드는 이런 식으로 쓰기 때문에, 헤더에없는 소스 파일을 간다 c-undefined-static-class-member-reference) – Mat

+0

당신에게 전혀 알려주지 않는 것은 무엇을 의미합니까? 정의되지 않은 참조가 있음을 알려주고 참조가 필요한 장소를 알려줍니다. 그게 당신이 필요로하는 모든 것입니다! –

+0

@LightnessRacesinOrbit @LightnessRacesinOrbit 실제 코드에 실제로 머무르는 두 번째 오류는 있지만 코드는 – Denis

답변

1

당신은 당신의 static 데이터 멤버 id_generator에 대한 정의를 추가하는 것을 잊었다 글로벌 네임 스페이스 수준에서 추가 :..

template<int dim> 
unsigned int Class2<dim>::id_generator = 0; 

이 추가함으로써, 당신은 당신의 코드 correctly compiling and linking here을 볼 수 있습니다

.
+0

덕분에 많이 도와주었습니다.) – Denis

+0

@Denis : 내 기쁨 :) –

1

글쎄, 오류 메시지가 말했듯이, 정적 데이터 멤버. 이 일반 클래스 인 경우, 당신은 소스 파일에 정의를 넣어 것 :

// header: 
class C { 
    static int i; 
}; 

// source: 
int C::i = 3; 

을 템플릿은 패턴이다; 컴파일러는이를 사용하여 코드를 생성합니다. 컴파일러가 템플릿을 인스턴스화 할 때 끝내기를 원하는 것은 앞의 코드와 같습니다.

// header: 
template <class T> 
class C { 
    static int i; 
}; 

template <class T> 
int C<T>::i = 3; 
+0

답장을 보내 주셔서 감사합니다. 나는 단 하나만 옳게 표시 할 수 있습니다. – Denis