2009-04-14 2 views
1
typedef boost::variant<long long,double,string> possibleTypes ; 

set<possibleTypes,less<possibleTypes> > ascSet ; 
set<possibleTypes,greater<possibleTypes> > descSet ; 

Wenn ich versuche zu kompilieren, bekomme ich eine Reihe von Fehlern in einigen Bibliothekskopfzeilen.
Aber wenn ich die dritte Zeile entfernen (die mit descSet), kompilieren Sie den Code ganz gut.std :: set gefüllt mit boost :: variant Elemente können nicht absteigend sortiert werden?

Was ist das Problem? Kann boost :: variant Objekte nicht in nachkommender Reihenfolge sortiert werden ??

Edit:
ich Visual Studio 2005 und bin mit 1.38.0 steigern und die folgende Befehlszeile:

cl /EHsc /I"C:\boost_1_38_0" test.cpp 

EDIT2 Wie es vorgeschlagen wurde, von Doug T, wenn ich definieren diese:

bool operator>(const possibleTypes& a, const possibleTypes& b){ 
    return b < a ; 
} 

Dann wird der folgende Code nicht kompiliert:

possibleTypes pt1="a", pt2="b" ; 
greater<possibleTypes> func ; 
cout << func(pt1,pt2) << endl ; 

Allerdings stellt dieser Code nur fein:

possibleTypes pt1="a", pt2="b" ; 
cout << (pt1 > pt2) << endl ; 

mir jemand zu verstehen, warum helfen könnte ??

ich mit VC versucht ++ 2005 und GCC 3.4.6

+0

Welche Version von Boost verwenden Sie? Ich habe gerade Ihren Code mit 1.38.0 und VC++ 9.0 ausprobiert und ohne Probleme kompiliert. – Ferruccio

+0

Wirklich? Es muss die Copiler-Version sein (ich habe gerade meinen Beitrag aktualisiert) – GetFree

+0

Kannst du wenigstens die ersten Fehlermeldungen angeben? I.e. diejenigen über die Deklaration selbst, nicht diejenigen, die daraus resultieren, dass descSet nicht richtig definiert ist. – MSalters

Antwort

0

Wie wurde vorgeschlagen, wenn ich diese definieren: Dieser Code kompiliert just fine

possibleTypes pt1="a", pt2="b" ; 
greater<possibleTypes> func ; 
cout << func(pt1,pt2) << endl ; 

jedoch:

possibleTypes pt1="a", pt2="b" ; 
cout << (pt1 > pt2) << endl ; 

bool operator>(const possibleTypes& a, const possibleTypes& b){ 
    return b < a ; 
} 

Dann wird der folgende Code nicht kompilieren

Könnte jemand mir helfen zu verstehen, warum?

Ich habe versucht mit VC++ 2005 und GCC 3.4.6

+1

Versuchen Operator definieren> im Namensraum boost: Namensraum boost {bool operator> (const possibleTypes & a, const possibleTypes & b) ...} . Der Compiler sucht an der falschen Stelle für den Bediener>, obwohl ich persönlich würde erwarten, dass es bei jedem Betreiber suchen> nimmt zwei possibleType Argumente. –

+1

Nope - Argument-dependent Nachschlag. Es ist ja nicht überall gehen zu suchen, es im Namensraum des Anrufers sieht (std :: mehr) und der Namensraum der Argumente (boost :: Variante). Im zweiten Fall ist der Namensraum des Anrufers (wahrscheinlich) der globale Namespace. – MSalters

+0

Danke, Max. Das Problem wurde behoben, indem man dem Boost-Namespace den Operator> hinzufügte. Dank, MSalters, für die Regeln zu klären. – GetFree

3

Es scheint ein < Operator für Schub definiert :: Variante aber keinen Operator>. So vielleicht std :: weniger <> funktioniert, aber nicht std :: mehr <>

here Siehe

Ich würde versuchen, einen freien> Operator definieren.

bool operator > (boost::variant<...> lhs, boost::variant<..> rhs) 
{ 
    return (rhs < lhs) // thanks Chris Jester Young 
} 
+0

Warum nicht einfach: return rhs

+0

ja, das wäre einfacher, wäre es nicht :) –

1

Sie müssen den größeren Operator verfügbar haben. Wenn possibleTypes keinen bietet, können Sie entweder einen freien wie Doug vorgeschlagen oder versuchen, Boost operators zu verwenden.

Verwandte Themen