본문 바로가기

템플릿

gcc와 Visual C++에서의 템플릿 인자의 가시성 문제 널리 쓰이는 C/C++ 컴파일러 구현에서 가장 중요한 것을 꼽으라면 단연 gcc(g++)와 Visual C++ 컴파일러이다. 이들은 각각 가장 많은 플랫폼과, 가장 널리 쓰이는 크로스 컴파일러 구현이라는 장점을 가지고 있다. 하지만 두 컴파일러 모두 복잡하기 이를데 없는 C++ 표준을 완벽하게 구현하고 있지는 않다. 물론, 이것은 표준이 제대로 안정화되어 있지 않았기 때문이다. 보다 현실적인 문제는, 두 컴파일러가 '소리 없이' 다르게 동작하는 것인데, gcc에서 잘 컴파일되는 코드가 Visual C++에서 제대로 컴파일되지 않거나, 그 반대의 경우가 종종 생긴다. 그 중에서 가장 대표적인 문제를 꼽으라면 템플릿 인자의 가시성 문제를 꼽을 수 있다. 특히, typedef을 사용하여 파생 클래스가 기반 클.. 더보기
템플릿 클래스에서의 템플릿 멤버 함수에 대한 템플릿 특수화 가끔, 템플릿 클래스에서 템플릿 멤버 함수를 쓸 일이 있다. 어떤 자료형 T에 대해 인스턴스화된 클래스에서, 다른 자료형 U를 인자(Argument)로 요구하는 멤버 함수가 필요할 때가 있는데, 이것은 설사 U가 T와 같은 자료형이라고 하더라도 컴파일 문제 때문에 이렇게 해야 할 일이 있다. 다음의 코드를 보면, template class Base { protected: T _value; public: void SetValue(T value) { _value = value; } } SetValue()는 동일한 T 자료형을 받아서 자신의 데이터 멤버에 대입하는 함수이므로, 아무런 문제가 없다. 그러나, 만약 T가 이런 방식의 연산자 오버로딩을 제공하지 않는다면 이 코드는 컴파일에 .. 더보기
코드를 여러 컴파일러에서 컴파일해보라 좋은 코드를 작성하는 방법 중 한가지는 코드를 여러 컴파일러에서 컴파일해보는 것이다. 크로스 플랫폼을 염두에 둔 코드라면 당연히 거쳐야 하는 것이지만, 보통 특정한 컴파일러에서 컴파일에 성공하고 원하는대로 동작한다면 그것으로 그만인 경우가 많다. 특히, 가장 널리 쓰이는 컴파일러 중 하나인 Visual C++ 컴파일러의 경우, 엄격하게 문법의 적법성을 따져가면서 컴파일하지 않는다. 물론 버전 7 이상이라면 표준을 대단히 잘 준수하는 편에 속하기는 하지만, Visual C++은 상업적 목적의 개발 환경에 맞추어 개발된 컴파일러이며, 그렇기 때문에 정확하게 표준에 부합하지 않더라도 최대한 스스로 정보를 파악하여 컴파일이 성공하도록 도와준다. 그렇지만, 같은 코드를 gcc로 컴파일해보면 컴파일에 실패하는 경우.. 더보기