템플릿의 세계에 빠져 살던 요즘..
동일한 코드가 어디서는 정상적으로 돌아가고, 어디서는 이상동작을 한다거나, 컴파일이 안 되는 경우가 있는데요..
찾아보니 Visual studio의 버그로 인한 것도 있더군요. 7.0에서는 패치되었다고는 하지만…6.0도 분명히 돈 받고 팔던 것인데…오류 사항이 있으면 패치를 할 생각을 안하고 다음 버전에서 때우다니 은근히 맘에 들지 않는군요.
http://womble.decadentplace.org.uk/c++/template-faq.html <- 보다 많은 FAQ가 있습니다. 보시면 많은 도움이 될 듯..그리고 아래는 Visual studio 관련 내용만 간단히 요약 해 두었습니다.
4. Q: 왜 Visual C++ 6.0은 클래스 밖에 선언된 템플릿 멤버 함수 정의를 이해하지 못 할까요?
class my_class {
public:
template<typename T> void func();
};
template<typename T>
void my_class::func()
{
// implementation
}
public:
template<typename T> void func();
};
template<typename T>
void my_class::func()
{
// implementation
}
A: 버그 입니다. 7.0에서 수정 되었습니다.
5. Q. 왜 Visual C++ 6.0에서 모든 템플릿 함수들은 똑같은 결과를 리턴 할까요?
template<typename T>
std::size_t my_sizeof()
{
return sizeof(T);
}
std::size_t my_sizeof()
{
return sizeof(T);
}
A: 버그 입니다. 7.0에서 수정 되었습니다. 6.0은 템플릿 함수 객체를 템플릿 인자가 아닌, 파라메터 타입에 의해서만 구분합니다. 우회적인 해결 방법으로는 사용하지 않는 템플릿 타입의 함수 파라메터를 기본 인자로 넘겨 주어 각 템플릿 함수 객체를 구분 할 수 있습니다.
template<typename T>
std::size_t my_sizeof(T * = 0)
{
return sizeof(T);
}