2016-02-09 40 views
1

我一直在玩升壓變體,遇到了似乎有問題的場景,但我覺得我缺乏如何正確使用助力變體的知識。下面是我放在一起C++ Boost變體錯誤

main.cpp 

#include <boost/variant.hpp> 
#include <iostream> 
#include <stdint.h> 

typedef boost::variant<uint16_t, uint32_t> MyInt; 

int main() 
{ 
    uint16_t regular = 11; 
    MyInt custom = regular; 

    std::cout << custom << '\n'; 
    return 0; 
} 

一個小測試程序確定,所以上述工作正常,但我得到一個錯誤,如果我試圖做到以下幾點:

int16_t invalid = 11; 
MyInt custom = invalid; // This line causes the error. 

我希望得到一個錯誤,但是錯誤並不能告訴我我的問題實際上發生在我的主要位置,但是在Boost的類中,這對於在更大的項目中工作時不是最有幫助的。

我開始研究助推訪問者將錯誤放在主要位置,但並未完全瞭解這些如何解決我的問題。我在訪客的正確軌道上還是錯過了其他一些?

編輯:

這裏真正的問題是在我的變種沒有指定任何類型的無效分配(即焦,的std :: string,double等)與其說轉換int16_t爲uint16_t。

+0

哪兒要補充這兩條線? (順便說一句,你有一個myInt的類型o) –

+0

如何使用另一個編譯器? Clang 3.7爲這段代碼提供了一些非常有用的錯誤信息。它還將錯誤的來源定位到MyInt custom = invalid; //這行代碼會導致錯誤。' – rettichschnidi

+0

MyInt中沒有錯別字,它是一個typedef,我用它們替換了第一行的兩行@ RichardHodges – MrJman006

回答

0

int16_t需要隱式轉換爲uint16_tuint32_t。因此,沒有最佳的重載,並且分配/初始化無法編譯。

強迫你喜歡的類型:

my_int = static_cast<int32_t>(int16_t_value); 
+0

我會澄清這個問題,但我並不特別在意將int16_t轉換爲uint16_t。我開始指定一個不屬於變體的類型(即,任何不是uintXX_t) – MrJman006

+0

您沒有得到這一點。即使有「澄清」的問題。將僞造值分配到變體中的問題是什麼?你爲什麼期望它編譯?它應該做什麼?你在尋找'boost :: any'嗎? (如果是這樣 - 這是一個99%的時間設計氣味,所以:爲什麼?) – sehe