아파치 자체에서 완전히 분리하려고하는 클래스가 포함 된 아파치 모듈 (.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
의 본문이 비어 있는지 (릴리스 빌드에 해당할지) 파악하고 호출에 대한 코드를 생성하지 않도록 코드를 작성하면 모든 곳에서 인수로 전달해야합니다. 수업에서.
할 수 있습니까?
그 다른 질문이 내가 묻는 것과 어떻게 관련이 있는지 모르겠습니다. – James
LogIt ('main.cpp')과'C :: DoThis' ('C. cpp')와 같은 .so? – willj
@willj 예. 그들은 같은 .so에서 끝납니다. – James