2012-04-11 4 views
0

다양한 상황에서 외부 함수를 호출해야하는 클래스가 있습니다. 나는 유연하게 유지하려는, 그래서 나는 단순화 된 예처럼 보이는 펑터, 함수 포인터 등으로 작동합니다 (수치 조리법의 제 3 판에서 영감을) 인터페이스를 사용하고 있습니다 : 지금까지템플릿 클래스와의 연결 오류

class MyClass { 
    public: 
    template <class T> 
    MyClass(T &f_) { f = f_; } 
    private: 
    int (*f)(int); 
}; 

int myFn(int i) { 
    return i % 100; 
} 

int main() { 
    MyClass test(myFn); 
    return 0; 
} 

을 너무 좋아. g ++은 불만없이 이것을 컴파일합니다. 내 실제 응용 프로그램에는 훨씬 많은 코드가 있으므로 여러 파일로 분할됩니다. 예를 들어,

test2.h :

#ifndef __test2__ 
#define __test2__ 

class MyClass { 
    public: 
    template <class T> 
    MyClass(T &f_);  
private: 
    int (*f)(int); 
}; 

#endif 

test2.cpp :

#include "test2.h" 

template <class T> 
MyClass::MyClass(T &f_) { 
    f = f_; 
} 

MAIN.CPP :

#include "test2.h" 

int myFn(int i) { 
    return i % 100; 
} 

int main() { 
    MyClass test(myFn); 
    return 0; 
} 

I이 사용 g++ test2.cpp main.cpp를 컴파일하려고, I 다음 링크 오류가 발생합니다.

/tmp/ccX02soo.o: In function 'main': 
main.cpp:(.text+0x43): undefined reference to `MyClass::MyClass<int()(int)>(int (&)(int))' 
collect2: ld returned 1 exit status 

g ++는 test2.cpp도 컴파일하려고한다는 사실을 알지 못합니다. 여기에 무슨 일이 일어날 지에 대한 아이디어가 있습니까?

감사합니다,

--craig

+0

[? 왜 템플릿에만 헤더 파일에서 구현 될 수있다]의 중복 가능성 (http://stackoverflow.com/questions/495021 : 당신은 헤더의 구현을 이동해야 의미

/왜 - 템플릿 전용 헤더 파일에 구현할 수 있는가) –

답변

1

템플릿 클래스가 완전히 전문하지 않는 한,이를 사용하는 모든 번역 단위 구현을 볼 수 있어야합니다.

//test2.h 
#ifndef __test2__ 
#define __test2__ 

class MyClass { 
    public: 
    template <class T> 
    MyClass(T &f_);  
private: 
    int (*f)(int); 
}; 

template <class T> 
MyClass::MyClass(T &f_) { 
    f = f_; 
} 

#endif