J'ai rencontré une erreur étrange concernant la recherche de nom en C++.C++ Erreur de recherche de nom de fonction surchargée
L'erreur peut être recréée en utilisant l'exemple minimale suivante:
#include <vector>
#include <iostream>
std::ostream& operator<<(std::ostream& out, const std::vector<int>& a) {
for (size_t i = 0; i < a.size(); i++) {
out << a[i] << std::endl;
}
return out;
}
namespace Test {
struct A {
// Label 1
friend std::ostream& operator<<(std::ostream& out, const A&) {
return out << "A" << std::endl;
}
};
struct B {
void printVector() noexcept {
std::vector<int> v{1, 2, 3};
std::cout << v << std::endl; // The error occurs in this line
}
// Label 2
friend std::ostream& operator<<(std::ostream& out, const B&) {
return out << "B" << std::endl;
}
};
}
int main() {
Test::B().printVector();
}
Compiler cela va entraîner dans le message d'erreur suivant:
cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
Vous pouvez tester par vous-même ici: http://cpp.sh/5oya
La partie étrange est, que le code compile et fonctionne bien si vous supprimez l'une des fonctions étiquetées avec // Label 1
respectivement // Label 2
.
Ma question est maintenant: Que se passe-t-il ici? Comment peut-il être réparé?
[Fonctionne ici] (http://coliru.stacked-crooked.com/a/99865250debbfc32) – NathanOliver
Visual Studio 2015 génère ce message d'erreur: "erreur C2679: binaire '<<': aucun opérateur trouvé qui prend un droit -opérande de type 'std :: vector>' (ou il n'y a pas de conversion acceptable) " –
g ++ version 5.3.1 produit ce message d'erreur: 'Erreur: aucune correspondance pour l'opérateur << << (les types d'opérandes sont» std :: ostream {aka std :: basic_ostream} «et» std :: vector «)' –
zuenni