Pourquoi mon code, pourtant valide, ne compile pas sous Visual C++ 6 ?
Visual C++ 6 est sorti en 1998, et n'inclue donc pas dernière norme du C++, datant de la même année. Il en résulte certains manques, et des résultats parfois étonnants avec du code pourtant parfaitement valide.
Voici quelques exemples de codes standards mais qui ne compilent pas sous VC++ 6
1 2 3 4 5 6 7 8 9
| for (int i = 0; i < 50; ++i)
{
// ...
}
for (int i = 0; i < 20; ++i) // Erreur : "i : redefinition"
{
// ...
} |
Ce code est pourtant correct : en effet la portée de la variable i devrait être limitée au bloc de la boucle concernée.
Une solution (de derrière les fagots) pour corriger ce manque : inclure systematiquement nos boucles dans un if, ainsi la portée sera bien limitée
#define for if (true) for
1 2 3 4 5
| struct A
{
static const int Taille = 12; // Erreur : "syntaxe non valide"
int Tab[Taille];
}; |
Ce code devrait compiler, car les constantes entières statiques peuvent être initialisées dans leur définition.
1 2 3 4 5 6 7 8 9 10 11
| struct A
{
void Func()
{
}
};
std::vector<A> Tab;
std::for_each(Tab.begin(), Tab.end(), std::mem_fun_ref(A::Func));
// Erreur : fonction 'void' renvoyant une valeur |
Cette écriture devrait être possible, mais VC6 ne sait pas la gérer du fait de son manque de spécialisation partielle de template.
1 2 3 4 5
| std::set<int> s;
std::vector<int> v(s.begin(), s.end()); // Erreur : "conversion impossible"
std::list<int> l;
l.sort(std::less<int>()); // Erreur |
VC6 ne gère pas correctement les fonctions membres template de classe template, ce qui entre autre vous empêchera d'utiliser les fonctions de la STL prenant en entrée une paire d'itérateurs quelconques, ou list::sort avec un foncteur personnalisé.
Partager