2013-08-02 4 views
2

아파치 자체에서 완전히 분리하려고하는 클래스가 포함 된 아파치 모듈 (.so)이 있습니다. 좌절의 가장 큰 원인은 디버그 로깅입니다. 템플릿 매개 변수를 통해 클래스에 로깅 기능을 전달할 수 있기를 원합니다. 모두가 같은 번역 단위에있을 때 나는 잘 작동하는 개념의 증거를 얻을 수 있습니다,하지만 그들은 아니에요되면 로깅 기능은 '정의되지 않은 참조'이기 때문에이 쓰러져서 :이 또한 발생임의의 함수를 템플릿 매개 변수 인수로 사용

/tmp/ccPdPX2A.o: In function `main': 
test.cpp:(.text+0x81): undefined reference to `void C::DoThis<&(LogIt(char const*, ...))>()' 
collect2: ld returned 1 exit status 

가 Apache는 클래스를 포함하는 모듈을로드하려고 시도합니다. 아래 코드는 문제가 재생하기 :

// main.cpp 
#include <iostream> 
#include "C.h" 

void LogIt(const char*, ...) 
{ 
    std::cout << "GADZOOKS!\n"; 
} 

int main(int argc, char* argv[]) 
{ 
    C c; 

    c.DoThis<LogIt>(); 
} 


// C.h 
typedef void (*LogFunction)(const char*, ...); 

class C 
{ 
public: 
    template <LogFunction L> 
    void DoThis(); 

    template <LogFunction L> 
    void DoThat(); 
}; 

// C.cpp 
#include "C.h" 

template <LogFunction L> 
void C::DoThis() 
{ 
    L("DoThis!"); 
    DoThat<L>(); 
} 

template <LogFunction L> 
void C::DoThat() 
{ 
    L("DoThat!"); 
} 

내가 함수 매개 변수로 전달 된 기능을 갖는에 의존해야하지 않으려는 것, 즉

template <typename F> 
void C::DoThis(F f) 
{ 
    f("DoThis!"); 
} 

나는를 구성하고 싶습니다 때문에 컴파일러가 LogIt의 본문이 비어 있는지 (릴리스 빌드에 해당할지) 파악하고 호출에 대한 코드를 생성하지 않도록 코드를 작성하면 모든 곳에서 인수로 전달해야합니다. 수업에서.

할 수 있습니까?

+0

그 다른 질문이 내가 묻는 것과 어떻게 관련이 있는지 모르겠습니다. – James

+0

LogIt ('main.cpp')과'C :: DoThis' ('C. cpp')와 같은 .so? – willj

+0

@willj 예. 그들은 같은 .so에서 끝납니다. – James

답변

1

내가 모든 것을 다시 좋아,

here

이제 #include "C.cpp" 위 참조 할 경우 설명 undefined reference to void C::DoThis<&(LogIt(char const*, ...))>()이 오류이 그래서 해결

undefined reference to void C::DoThat<&(LogIt(char const*, ...))>()

으로 이어질 것입니다 :

template <LogFunction L> 
void C::DoThat() //Notice :: used here 
{ 
    L("DoThat!"); 
} 

그리고 모든 것이 준수되고 실행됩니다!

0

이것은 C.h의 선언과 C.c.의 정의 만 있기 때문에 컴파일러가 템플릿을 인스턴스화 할 시점에서 템플릿을 볼 수 없기 때문입니다.

템플릿 정의를 헤더로 옮기거나 C.c.에서 인스턴스화하십시오. C.c에서 LogIt 선언문을 제공해야합니다.

0

템플릿 정의를 선언 된 위치와 동일하게 지정해야합니다. 즉, 헤더 파일에 선언 된 LogIt 함수를 사용해야합니다. 현재로서는 템플릿 선언과 그 정의를 명시 적으로 분리 할 수 ​​없습니다.

관련 문제