다음을 통해 공유


표준 C++ 라이브러리 변경 내용: Visual C++ .NET 2003

업데이트: 2007년 11월

Visual C++ 6.0으로 컴파일된 표준 C++ 라이브러리 코드를 사용하는 프로그램을 업그레이드할 경우 다음과 같은 문제점을 고려해야 합니다.

  • reverse_iterator 변경

  • 더 이상 포인터와 같지 않은 반복기

  • 최소/최대 #define 변경

reverse_iterator 변경

표준 C++ 라이브러리 reverse_iterator 클래스에 의해 정의된 일부 형식의 이름이 변경되었습니다. 또한, 이 클래스에는 다른 템플릿 인수도 있습니다.

다음 예제는 Visual C++ 6.0에서는 컴파일되지만 현재 버전에서는 컴파일되지 않습니다.

#include <iterator>
#include <vector>
typedef std::iterator<std::random_access_iterator_tag, char, int> random_it;

int main( )
{
   char c;
   
   // too many template args for VC7
   typedef std::reverse_iterator< random_it, char, char&, char *, int > rev_it; 
   rev_it::reference_type x = c;
   rev_it::pointer_type y = 0;
   rev_it::iter_type z;

   /*
   // try the following code instead
   typedef std::reverse_iterator< random_it > rev_it;
   rev_it::reference a = c;
   rev_it::pointer b = 0;
   rev_it::iterator_type c1;
   */
}

더 이상 포인터와 같지 않은 반복기

일부 표준 C++ 라이브러리 클래스에서 반복기는 더 이상 포인터 형식으로 정의되지 않습니다.

다음 예제는 Visual C++ 6.0에서는 컴파일되지만 현재 버전에서는 표시된 위치에서 컴파일 되지 않습니다.

#include <string>
#include <vector>
#include <algorithm>

bool pred(int i) { 
   return true; 
};

int main()
{
   std::string str("test");
   const char *pszstr = str.begin();       // LINE 8: INCORRECT
   const char *pszStr2 = str.c_str();      // OK
   const char *pszStr3 = &(*str.begin());  // OK

   std::vector<int> v;
   int *pint = std::remove_if(v.begin(), v.end(), pred);   // LINE 13: INCORRECT
   std::vector<int>::iterator iint = std::remove_if(v.begin(), v.end(), pred);   // OK
}

최소/최대 #define 변경

다음 _MIN_MAX의 표준 C++ 라이브러리 정의

#define _MAX   _cpp_max
#define _MIN   _cpp_min

아래와 같이 변경되었습니다.

#define _MAX   (max)
#define _MIN   (min)

이것은 std::_MIN의 정의를 무효로 만듭니다.

다음 예제는 Visual C++ 6.0에서는 컴파일되지만 현재 버전에서는 표시된 위치에서 컴파일 되지 않습니다.

#include <xutility>
#include <stdlib.h>
using namespace std;
int main()
{
   std::_MAX(3,4);   // error
   _MAX(4,5);
}

참고 항목

개념

표준 C++ 라이브러리 변경 내용