헤더에 평범한 (템플릿이 아닌) 클래스의 정적 변수를 정의하면 링커 오류가 발생하지만 템플릿의 경우 모두 정상적으로 작동하며 더 나아가 우리는 모든 번역 단위 사이의 정적 변수는 :템플릿 고정 변수
이 템플릿 헤더 (template.h)입니다 :
// template.h
template<typename T>
class Templ {
public:
static int templStatic;
};
template<typename T> Templ<T>::templStatic = 0;
그것은 최초의 장치 템플릿을 사용하여 (unit1.cpp)
// unit1.cpp
#include "template.h"
int method1() {
return Templ<void>::templStatic++;
}
두 번째 단위 그는 재 (unit2.cpp) :
// unit2.cpp
#include "template.h"
int method2() {
return Templ<void>::templStatic++;
}
그리고 마지막으로, MAIN.CPP :
0
1
:
// main.cpp
#include <iostream>
int method1();
int method2();
int main(int argc, char** argv) {
std::cout << method1() << std::endl;
std::cout << method2() << std::endl;
}
, compilling 연결하고이 코드를 실행 한 후에, 우리는 출력이 다음과 같은 것이다
그럼 왜 템플릿의 경우 모두 정상적으로 작동합니까? 컴파일러 나 링커가 어떻게 처리합니까? (컴파일러를 분리하여 호출 할 때 각 .cpp 파일을 컴파일 한 다음 링커에 연결하여 컴파일러와 링커가 동시에 모든 .cpp 파일을 "보지"마십시오.)
PS : 제 컴파일러 : msvcpp 9 (하지만 너무와 Mingw에 확인)
** ** 작동하지 않는 코드를 사용하면 더 유용 할 것입니다. – JesperE
작동하지 않는 코드는 헤더에 변수를 정의하여 둘 이상의 파일 (포함되지 않음)에 포함되어 이름 충돌이 발생한다고 가정합니다. – falstro