2011-04-25 3 views
0

템플릿 함수를 하나의 파일에 정의하고 많은 파일에서 사용하려고합니다. 이 기능은 일반 함수 프로토 타입과 동일한 방식으로 작동합니까? 그래서 한번 정의하고 다른 파일에 프로토 타입을 포함시킬 수 있습니까? 나는 클래스와 동일한 질문을 가지고 있는데, 클래스와 마찬가지로 각 헤더 파일에 템플릿 클래스의 전체 정의를 포함시켜야합니까? 그것은 템플릿 함수를 별도의 파일로 두 번 정의했거나 체크하지 않은 경우에 발생합니다.다른 파일에서 템플릿 함수와 클래스 사용

질문 하나 더, 템플릿 함수 프로토 타입의 형식은 무엇입니까?

+0

http://stackoverflow.com/questions/3368883/how-does-this-size-of-array-template-function-work 정의가 실제로 필요하지 않은 템플릿 프로토 타입의 예를 보여줍니다. 그래서 링커는 불평하지 않습니다. – QuentinUK

답변

4

아니요, 일반 기능과 다릅니다. bar.cc으로, 이러한 기능을 사용하는 모든 소스 파일의 헤더를 인클루드하고, foo.cc로, 같은를 등을 정기적 기능으로, 당신은 헤더에

void foo(int); 
void foo(double); 

를 선언 할 수있는 몇 가지 소스 파일에서 함수를 정의, 링커가 나머지를하도록하십시오. 컴파일러는 bar.cc을 컴파일하고 bar.o을 생성합니다. 어딘가에 함수를 정의했는지 확인하고, 그렇지 않은 경우 링크 타임 오류가 발생합니다.

그러나 템플릿 사용하는 경우 : 그것이 어떻게 작동하는지 상상하는

template <typename T> 
void foo(T) ... 

시도. foo.ccbar.cc 소스 파일은 독립적이며 서로에 대해 알지 못한다. 단 두 가지 헤더에있는 내용에 모두 동의한다는 점만 제외하면 #include (전체 아이디어)입니다. 따라서 bar.ccfoo.cc이 어떻게 구현되는지 알지 못하며, foo.cc은 이러한 기능으로 어떤 것이 수행 될지 알 수 없습니다. 이 시나리오에서 foo.cc을 알지 못합니다. bar.cc은 T으로 지정할 것입니다. 그렇다면 foo.cc에는 태양 아래 모든 typename에 대한 정의가 어떻게 있습니까?

이렇게 할 수 없으므로이 방법은 허용되지 않습니다. 컴파일러가 foo(int) 또는 foo(string) 또는 또는 bar.cc이 무엇이든간에 정의를 작성할 수 있도록 헤더에 전체 템플릿이 있어야하며이 템플릿을 bar.o에 빌드해야합니다 (또는 템플릿이 의미가없는 경우 불평합니다). 유형).

클래스에 대해서도 마찬가지입니다.

규칙은 템플릿 전문화와 약간 다르지만 고급 기법을 시도하기 전에 기본 사항을 잘 이해해야합니다.

+0

그냥 정의를 사용하는 두 개의 개별 파일에서 다르게 정의한다면, 실수로 이것을 수행한다고해도 되겠습니까? 각 정의는 템플릿을 인스턴스화하는 파일에 대해 로컬입니까?왜 내가 템플릿 같은 프로토 타입을 정의 할 수 없습니까? void foo (T); 이것은 최신 버전의 C++에서 작동하는 것으로 보입니다. 앞으로는 어떤 문제도 일으키지 않을 것입니다. – rubixibuc

+0

@rubix - 당신은 절대적으로 동등하지 않은 정의를 가질 수 없습니다. 대개 헤더 파일에 넣고 템플릿을 사용하는 모든 곳에서이를 포함시켜이 문제를 해결합니다. –

+0

@rubixibuc : 예, 각 정의는 그것을 볼 수있는 소스 파일에 적용됩니다. 소스가 두 가지를 모두 볼 때만 충돌이 발생합니다. 컴파일러는 그와 같은 프로토 타입을 허용 할 수 있습니다. (이유는 모르겠지만) 호출하는 소스가 볼 수있는 정의를 제공하지 않고 함수를 사용하려고하면 컴파일러에서 불평 할 것입니다. 나는 알고있다). – Beta

2

이 부분은 FAQ을 참조하십시오. 특히 items 12, 13 and 14은 템플릿 함수의 선언과 정의를 분리합니다.

+0

나는 faqs를 읽었으며, 또 다른 참조는 "typename"을 "class"ex - template 으로 대체 한 것입니다.이 의미는 무엇입니까? : -/ – rubixibuc

+0

금지 된 파일 "금지됨이 서버에서 요청한 파일에 액세스 할 수있는 권한이 없습니다." 일반 대중이 액세스 할 수있는 파일에만 연결하십시오. – QuentinUK

관련 문제