2009-07-10 9 views
2

J'ai une classe de modèle qui compile bien dans VC6. Mais il ne compile pas dans VC9. Pour cela j'ai ajouté le mot-clé "typename" devant un type. Après cela, il compile en vc9 mais pas en VC6. Comment puis-je le faire compiler avec les deux compilateurs.Comment faire pour que cette classe de modèle compile à la fois dans VC6 et VC9

#include <map> 
#include <vector> 

template <class T1, class T2> 
class A 
{ 
public: 
    std::pair<typename std::vector<std::pair<T1,T2> >::iterator, bool > insert(const std::pair<T1 ,T2> &value_in); 
}; 

template <class T1, class T2> 
std::pair< std::vector<std::pair<T1,T2> >::iterator, bool> A<T1,T2>::insert(const std::pair<T1 ,T2>& value_in) 
{ 
    std::pair< std::vector<std::pair<T1,T2> >::iterator, bool> b; 
    return b; 
} 

void main() 
{ 
    A<int, int> a; 
    a.insert(std::pair<int, int>(0, 0)); 
} 

Le code ci-dessus est compilé dans VC6. Mais pas dans VC9. Le code suivant fonctionne dans VC9, pas dans VC6.

#include <map> 
#include <vector> 

template <class T1, class T2> 
class A 
{ 
public: 
    std::pair<typename std::vector<std::pair<T1,T2> >::iterator, bool > insert(const std::pair<T1 ,T2> &value_in); 
}; 

template <class T1, class T2> 
std::pair<typename std::vector<std::pair<T1,T2> >::iterator, bool> A<T1,T2>::insert(const std::pair<T1 ,T2>& value_in) 
{ 
    std::pair< std::vector<std::pair<T1,T2> >::iterator, bool> b; 
    return b; 
} 

void main() 
{ 
    A<int, int> a; 
    a.insert(std::pair<int, int>(0, 0)); 
} 
+3

À un certain moment vous obtenez au niveau de sillyness d'écrire du code qui compile à la fois VC9 et Fortran 77. – MSalters

Répondre

5

VC6 n'est pas très conforme aux normes. Vous devrez peut-être #IFDEF contourner celui-ci.

1

Je n'ai pas VC6, mais VC2003 se plaint aussi. Donc, je mets un typename avant

std::pair< typename std::vector<std::pair<T1,T2> >::iterator, bool > insert(const std::pair<T1 ,T2> &value_in); 

pour le rendre

typename std::pair< typename std::vector<std::pair<T1,T2> >::iterator, bool > insert(const std::pair<T1 ,T2> &value_in); 

Et cela a fonctionné, vous pouvez peut-être essayer aussi. HTH,

+0

Cela n'a pas fonctionné –

+0

Chose curieuse Comeau se plaint aussi . Essayez de mettre le typename avant l'utilisation de std :: vector > comme std :: pair > :: iterator, bool> b; Le Comeau accepte. – Abhay

1

Changements a commenté:

#include <map> 
#include <vector> 

template <class T1, class T2> 
class A 
{ 
public: 
    std::pair<typename std::vector<std::pair<T1,T2> >::iterator, bool > insert(const std::pair<T1 ,T2> &value_in); 
}; 

template <class T1, class T2> 
std::pair< typename std::vector<std::pair<T1,T2> >::iterator, bool> // +typename 
A<T1,T2>::insert(const std::pair<T1 ,T2>& value_in) 
{ 
    std::pair< typename std::vector<std::pair<T1,T2> >::iterator, bool> b; // +typename 
    return b; 
} 

int main() // void->int 
{ 
    A<int, int> a; 
    a.insert(std::pair<int, int>(0, 0)); 
} 
+0

Les deux noms de types le rendent correct C++. Utilisez celui-ci comme votre 'principal', adaptez-le avec un certain #ifdefs pour VC6 spécifiquement si vous avez vraiment besoin d'imho. – Pieter

Questions connexes