Bonjour à tous,
je n'arrive pas à comprendre pourquoi le code suivant ne compile pas:
Le compilateur me renvoie:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 #include <iostream> #include <fstream> #include <vector> #include <iterator> namespace foo { template<typename T=double> struct Bar { T baz; }; } std::istream& operator>>(std::istream& in, foo::Bar<>& f) { return in >> f.baz; } int main() { std::ifstream f("test.txt"); std::istream_iterator<foo::Bar<>> Begin(f); std::istream_iterator<foo::Bar<>> End; std::vector<foo::Bar<>> data(Begin, End); }
alors que celui-ci compile:error C2679: '>>' binaire*: aucun opérateur trouvé qui accepte un opérande de partie droite de type 'foo::Bar<>' (ou il n'existe pas de conversion acceptable)
(Je compile sous Visual 2008). Il semblerait que la surcharge des opérateurs de flux doive "vivre" dans le même namespace que l'objet pour lequel on réalise cette surcharge mais je n'arrive pas à comprendre pourquoi (est-ce une limitation de visual ou est-ce lié directement au langage / norme)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 #include <iostream> #include <fstream> #include <vector> #include <iterator> namespace foo { template<typename T=double> struct Bar { T baz; }; std::istream& operator>>(std::istream& in, Bar<>& f) { return in >> f.baz; } } int main() { std::ifstream f("test.txt"); std::istream_iterator<foo::Bar<>> Begin(f); std::istream_iterator<foo::Bar<>> End; std::vector<foo::Bar<>> data(Begin, End); }
Partager