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

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

當我嘗試編譯時,在某些庫頭文件中出現一堆錯誤。
但是,如果我刪除第三行(與descSet一)代碼編譯就好了。std :: set填充boost :: variant元素不能被排序後代?

有什麼問題?無法提升::變體對象按子序排列?

編輯:
我使用Visual Studio 2005和Boost 1.38.0和以下命令行:

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

EDIT2 至於有人建議,由Doug T,如果我這個定義:

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

然後將以下代碼不能編譯:

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

然而,這個代碼編譯就好:

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

誰能幫助我瞭解爲什麼?

我試着用VC++ 2005和GCC 3.4.6

+0

你正在使用哪個版本的Boost?我只是用1.38.0和VC++ 9.0來測試你的代碼,它沒有任何問題編譯。 – Ferruccio 2009-04-14 20:11:19

+0

真的嗎?它必須是複印機版本(我剛更新了我的文章) – GetFree 2009-04-14 20:15:55

+0

你能提供至少第一個錯誤信息嗎?即關於聲明本身的那些,而不是由descSet被不正確定義的結果。 – MSalters 2009-04-15 09:03:44

回答

0

至於有人建議,如果我定義的:

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

然後將以下代碼不能編譯:

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

然而,這個代碼編譯就好:

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

任何人都可以幫助我理解爲什麼?

我試過用VC++ 2005和GCC 3.4.6

3

它會出現一個<運營商爲提升定義::變種,但不是>運營商。因此,或許性病::少<>的作品,但沒有標準::更大<>

here

我會嘗試定義一個免費>運營商。

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

您需要有更大的操作員可用。如果possibleTypes不提供一個,您可以定義一個像Doug建議的免費類型或嘗試使用Boost operators