Beim Versuch, den folgenden Code zu kompilieren (ab ursprünglichem vereinfacht):g ++ std :: Satz kann nicht Operator finden <für die Klasse definiert
#include <cstdlib>
#include <iostream>
#include <set>
namespace OrbitSets {
class rational;
}
bool operator<(OrbitSets::rational a, OrbitSets::rational b);
namespace OrbitSets {
// Class definition
class rational {
private:
long long numerator;
long long denominator;
public:
rational() {
numerator = 0;
denominator = 1;
}
rational(int a) {
numerator = a;
denominator = 1;
}
friend bool ::operator<(rational a, rational b);
};
}
// Ordering operations
inline bool operator<(OrbitSets::rational a, OrbitSets::rational b) {
return a.numerator * b.denominator < b.numerator * a.denominator;
}
int main() {
const OrbitSets::rational a = 5;
const OrbitSets::rational b = 3;
std::set<OrbitSets::rational> c;
c.insert(a);
if (a < b) return 1;
return 0;
}
gcc beschwert sich über die c.insert Linie, die es nicht Operator finden < für die OrbitSets :: rationale Klasse, die folgende Fehlermeldung geben:
/usr/include/c++/5/bits/stl_function.h:387:20: error: no match for ‘operator<’ (operand types are ‘const OrbitSets::rational’ and ‘const OrbitSets::rational’)
{ return __x < __y; }
wenn jedoch die c.insert (a) Linie zu kommentieren weg, kompiliert der Code korrekt, auch wenn zwei Zeilen später ein ähnlicher Vergleich gemacht wird, mit die gleiche Art von Argumenten.
Ich benutze g ++, um dies zu kompilieren, warum ist es nicht möglich, den oben genannten Operator für die Verwendung in der weniger Vorlageklasse zu finden, ist aber in der Lage, es für die Verwendung 2 Zeilen später zu finden?
Setzen Sie den Operator in den gleichen Namensraum wie 'rational'. –