Modifiche alla libreria standard di C++: Visual C++ .NET 2003

Aggiornamento: novembre 2007

Se si aggiorna un programma nel quale è previsto l'utilizzo del codice della libreria standard di C++ compilato in Visual C++ 6.0, tenere presente quanto segue:

  • Modifiche di reverse_iterator

  • Alcuni iteratori non corrispondono più ai puntatori

  • Modifica delle #define di MIN/MAX

Modifiche di reverse_iterator

Sono stati modificati i nomi di alcuni tipi definiti dalla classe reverse_iterator della libreria standard di C++ e anche gli argomenti del template di questa classe sono diversi.

L'esempio riportato di seguito viene compilato in Visual C++ 6.0, ma non funziona nella versione attuale.

#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;
   */
}

Alcuni iteratori non corrispondono più ai puntatori

In alcune classi della libreria standard di C++ gli iteratori non sono più definiti come tipi puntatore.

L'esempio riportato di seguito viene compilato in Visual C++ 6.0, ma non funziona nelle righe indicate nella versione attuale.

#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
}

Modifica delle #define di MIN/MAX

La definizione della libreria standard di C++ di _MIN e _MAX è stata modificata da:

#define _MAX   _cpp_max
#define _MIN   _cpp_min

in:

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

Le definizioni di std::_MIN non sono quindi più valide.

L'esempio riportato di seguito viene compilato in Visual C++ 6.0, ma non funziona nella riga indicata nella versione attuale.

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

Vedere anche

Concetti

Modifiche alla libreria standard di C++