2011-03-12 68 views
0

當包含boost :: exception時,我有兩級變量struct的奇怪問題。我有下面的代碼片段:組合boost :: exception和boost :: variant的問題

#include <boost/variant.hpp> 
#include <boost/exception/all.hpp> 

typedef boost::variant<int> StoredValue; 
typedef boost::variant<StoredValue> ExpressionItem; 
inline std::ostream& operator << (std::ostream & os, const StoredValue& stvalue) { return os;} 
inline std::ostream& operator << (std::ostream & os, const ExpressionItem& stvalue) { return os; } 

當我嘗試編譯它,我有以下錯誤:

boost/exception/detail/is_output_streamable.hpp(45): error C2593: 'operator <<' is ambiguous 
test.cpp(11): could be 'std::ostream &operator <<(std::ostream &,const ExpressionItem &)' [found using argument-dependent lookup] 
test.cpp(8): or  'std::ostream &operator <<(std::ostream &,const StoredValue &)' [found using argument-dependent lookup] 
1> while trying to match the argument list '(std::basic_ostream<_Elem,_Traits>, const boost::error_info<Tag,T>)' 
1> with 
1> [ 
1> _Elem=char, 
1> _Traits=std::char_traits<char> 
1> ] 
1> and 
1> [ 
1>  Tag=boost::tag_original_exception_type, 
1>  T=const type_info * 
1> ] 

代碼片斷簡化儘可能在實際的代碼是結構要複雜得多並且每個變體都有五個子類型。

當我刪除的#include升壓/異常/所有,並嘗試下面的測試片段中,程序正確編譯:

void TestVariant() 
{ 
    ExpressionItem test; 
    std::stringstream str; 
    str << test; 
} 

可能有人請告訴我如何使用時,以偶函數定義操作符< < boost :: Exception?

感謝和問候

裏克

+0

我不認爲這與boost :: exception有什麼關係。這是輸出流「operator <<」。但是我沒有使用這個變體,因爲你正在使用它 - 只有一種類型;我以爲你應該至少有兩種類型,因爲這是一個「類固醇聯合」,但也許有一些隱含的...我會重新訪問文檔。 – celavek 2011-03-13 00:02:00

+0

單一類型僅用於示例目的。在我的真實代碼中,每個變體都有五個子類型。如果沒有boost :: exception,包括一切正常。 – Rick 2011-03-13 00:06:15

+0

你的代碼是否在boost命名空間中?我認爲你的輸出流操作符與爲異常定義的操作符衝突。嘗試把你的代碼放在你自己的名字空間中。 – celavek 2011-03-13 00:13:50

回答

0

我不認爲這有什麼關係了boost ::例外。這是輸出流「運營商< <」。但是我沒有使用這個變體,因爲你正在使用它 - 只有一種類型;我以爲你應該至少有兩種類型,因爲這是一個「類固醇聯合」,但也許有一些隱含的...我會重新訪問文檔。

您的代碼是否在boost命名空間中?我認爲你的輸出流操作符與爲異常定義的操作符衝突。嘗試把你的代碼放在你自己的名字空間中。

而對於運營商沒有執行它可能仍然是選錯了一個的問題......試圖通過與命名空間和解析運算符前綴它作爲你STD做用你的「< <」運營商:: stringstream的。

編輯:作爲後續行動,以你最後的評論:你可以在自己的名稱空間定義你的運營商,我們說了myNameSpace然後用你的版本明確需要的時候,例如

void TestVariant() 
{ 
    using namespace mynamespace; 

    ExpressionItem test; 
    std::stringstream str; 
    str << test; 
} 

它將與上述例子的工作,但我不知道這,是你所面臨的確切情況......,我不是很熟悉精神

+0

使用名稱空間來封裝我的運算符<<並使用名稱空間前綴來調用它絕對是一種解決方案。但是前綴不能用在我需要使用我的operator <<變體的現有庫中。這就是爲什麼我需要在全局命名空間中定義operator <<的原因。謝謝。 – Rick 2011-03-13 08:40:42

+0

我不認爲我完全理解。你是否希望你的操作員可以在現有的庫中使用,並用它來代替標準的?就像在圖書館已經建成和運送? – celavek 2011-03-13 10:21:59

+0

例如助力精神庫。我在語法中使用自己的結構/變體。爲了調試目的(顯示當前解析樹),我需要顯示我的結構的內容。這是通過在所有通過的結構上使用boperator <<內部精神機制完成的。所以我不能使用任何命名空間或任何其他黑客,但需要在全局命名空間中使用這些運算符<<。所有這些工作正常,直到boost :: exception不包括在內。所以問題可能在那裏。 – Rick 2011-03-13 11:45:48