2011-04-18 3 views
0

저는 작업이 있습니다 :템플릿 클래스에서 템플릿 이외의 함수 사용하기

템플릿 벡터 클래스를 구현하려면 (myvector라고 부르겠습니다). 내 프로젝트의 여러 파일에서이 클래스를 사용해야하므로 "myvector.h"파일에 선언하고 "myvector.hpp"파일에 구현 한 다음 "myvector.hpp"를 "myvector"에 포함 시켰습니다. h "로 표시됩니다 (there 설명 참조). 그러나 "myvector.hpp"에는 템플릿이 아닌 함수가 하나 있습니다. 그래서 "myvector.h"파일을 메인 파일에 포함 시키면 모든 것이 잘 동작합니다. - "bignum.h"코드가 메인에 모두 포함됩니다

error LNK2005: "unsigned int __cdecl gerasimov_dmitry::calculate_capacity(unsigned int)" ([email protected][email protected]@[email protected]) already defined in bignum.obj 

가 나는 원인을 이해 : 나는 또 다른 하나 개의 파일 ("bignum.cpp")의 "myvector.h"를 포함 할 때, 나는 링커 오류 .cpp 및 bignum.cpp 파일에서 컴파일러가 어떤 calculate_capacity 함수를 사용할 지 알지 못합니다. 그래서, 제 질문은이 상황을 해결하는 방법입니다.

답변

4

inline 함수를 선언하거나 정의를 단일 번역 단위로 이동해야합니다. 당신이 직면하고

문제는 당신이에게 헤더에 함수를 정의하고, 하나 개 이상의 번역 단위에서 해당 헤더를 포함 경우, 컴파일러는 모든 번역 단위 에서 함수를 생성하는 것입니다.

링커가 프로그램 (또는 라이브러리)을 생성하려고 시도 할 때 함수가 으로 정의되어으로 여러 번 정의되었고 ODR (One Definition Rule)을 위반하는 것으로 불평합니다. 함수를 inline으로 표시하면 컴파일러에서 해당 함수에 플래그를 지정하여 링커가 질식하는 대신 여러 정의를 볼 때 정의 중 하나만 제외하고 모두 삭제합니다.

+0

감사합니다. 인라인은 잘 작동했다. 나는 하나의 번역 단위로 정의를 옮기기 위해 노력했지만, 내가 잘못했다고 생각한다. :) – karlicoss