Namspace déclarant un template externe

Namspace déclarant un template externe - C++ - Programmation

Marsh Posté le 01-08-2009 à 17:12:16    

Tout est dans le code ...
 

Code :
  1. #include <vector>
  2. #include <iostream>
  3. namespace mynamespace {
  4. using std::iterator;
  5. using std::vector;
  6. }
  7. int main() {
  8. mynamespace::vector<int> integers(5);
  9. for(mynamespace::iterator<int> iter = integers.begin(); iter != integers.end(); iter++) {
  10.  std::cout << "- " << iter << std::endl;
  11. }
  12. return 0;
  13. }


 
Toute est dans la réponse du compilateur ...

g++ -Wno-deprecated -Wall -g  my_vector.cpp -o my_vector
my_vector.cpp: In function 'int main()':
my_vector.cpp:12: error: wrong number of template arguments (1, should be 5)
/usr/include/c++/4.3/bits/stl_iterator_base_types.h:110: error: provided for 'template<class _Category, class _Tp, class _Distance, class _Pointer, class _Reference> struct std::iterator'
my_vector.cpp:12: error: invalid type in declaration before '=' token
my_vector.cpp:12: error: cannot convert '__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >' to 'int' in initialization
my_vector.cpp:12: error: no match for 'operator!=' in 'iter != integers.std::vector<_Tp, _Alloc>::end [with _Tp = int, _Alloc = std::allocator<int>]()'


 
Comme le code le montre, j'utilise la STL qui définit :

iterator begin()
const_iterator begin()


 
Surement, un indice ... si je remplace iterator par const_iterator dans mon code, l'erreur :

Code :
  1. g++ -Wno-deprecated -Wall -g my_vector.cpp -o my_vector
  2. my_vector.cpp:5: error: 'std::const_iterator' has not been declared
  3. my_vector.cpp: In function 'int main()':
  4. my_vector.cpp:12: error: 'const_iterator' is not a member of 'mynamespace'
  5. my_vector.cpp:12: error: expected primary-expression before 'int'
  6. my_vector.cpp:12: error: expected `;' before 'int'
  7. my_vector.cpp:12: error: 'iter' was not declared in this scope
  8. make: *** [my_vector] Erreur 1

Reply

Marsh Posté le 01-08-2009 à 17:12:16   

Reply

Marsh Posté le 01-08-2009 à 18:23:29    

On dirait un probleme d'ADL foireux.
Quelle version de g++ ?

Reply

Marsh Posté le 01-08-2009 à 19:26:49    

Essaye sans l'utilisation de mynamespace mais avec std, tu auras exactement le même problème.  L'itérateur que renvoie std::vector<>::begin() est de type std::vector<>::iterator, pas std::iterator<>.
 
std::iterator<> est une classe template dont l'utilité est d'aider à définir des itérateurs en fournissant tous les typedefs nécessaires.  Elle ne s'emploie jamais directement (et à 5 paramètres, comme te le dis le premier message d'erreur).


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 01-08-2009 à 19:58:55    

Merci à vous deux :jap:  
 
Effectivement,  erreur d'inattention  :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed