2017-12-19 30 views
0

가변적 인 템플릿으로 간단한 함수를 선언했습니다. , first (std::string), id (unsigned int) 나는 second (std::string)부호없는 int의 사용으로 인해 가변적 인 템플릿 C++에서 확인할 수없는 외부 기호 오류

받고 있어요 : - 다음과 같은 방법으로 그것을 호출시

template<typename ...Args> 
void Log(const LogLevel level, const char * format, Args ...args); 

Log(LogLevel::debug, 
     R"(starting x, %d pending call for "%s" with param "%s")", 
     id, first.c_str(), 
     second.c_str()) 

변수 유형은 어디에 다음 오류 :

Error LNK2001 unresolved external symbol "public: void __cdecl Log<unsigned int,char const *,char const *>(enum LogLevel,char const *,unsigned int,char const *,char const *)" 

함수 호출에서 unsigned int 인수를 제거하면 오류가 사라집니다. AFAIK 가변적 인 템플릿은 다양한 유형을 지원합니다 ... 그래서 나는 무엇을 놓치고 있습니까?

+0

"나는 variadic 템플릿으로 간단한 함수를 선언했습니다." 그리고 어디서 어떻게 정의 했습니까? –

+1

템플릿 함수 * 정의 *가 헤더 파일에 *없는 * 경우 [this] (https://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the- 헤더 파일). 그렇지 않으면 [mcve]를 게시하십시오. –

+0

이것을 놓쳤습니다! 관련 게시물에 대한 링크를 제공해 주셔서 감사합니다. – YafimK

답변

2

링커 오류입니다. 따라서 헤더 파일에서 템플릿 함수를 선언하고 C++ (헤더 아님) 파일에 정의했습니다.

다른 C++ 파일에서 unsigned int을받는 템플릿 함수를 사용하는 경우 컴파일러는 구현할 함수의 버전을 알지 못합니다.

간단한 해결책 : 머리말에 템플릿 함수/클래스/구조체를 선언하고 정의하십시오.

내가 잘못하면 ... 오류를 복제하기위한 최소한의 예를 준비하십시오.