2016-02-09 4 views
1

Я играю с форсированным вариантом и натолкнулся на сценарий, который кажется проблематичным, но я чувствую, что я не знаю, как правильно использовать вариант boost. Вот маленький тестер программы я соединялОшибка модификатора C++

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, которая не является наиболее полезной при работе в более крупном проекте.

Я начал изучать побуждение посетителей размещать ошибку в главном, но не совсем понял, как эти проблемы могут решить мою проблему здесь. Я нахожусь на правильном пути с посетителями или я пропущу что-то еще?

Edit:

Реальный вопрос здесь является недействительным назначение любого типа, не указанных в моем варианте (то есть символ, станд :: строка, двойной и т.д.) не столько преобразования int16_t в uint16_t.

+0

где именно Вы добавляете эти две строки? (Кстати, у вас есть тип-o в имени myInt) –

+0

Как насчет использования другого компилятора? Clang 3.7 предоставляет очень полезное сообщение об ошибке для этого кода. Он также указывает источник ошибки на строку 'MyInt custom = invalid; // Эта строка вызывает ошибку. ' – rettichschnidi

+0

Нет опечатки в MyInt, это typedef, и я заменяю первые 2 строки в основном с ними @ RichardHodges – MrJman006

ответ

0

int16_t требует неявного преобразования как для uint16_t, так и для uint32_t. Поэтому нет лучшей перегрузки, и присваивание/инициализация не скомпилируются.

принуждать ваш тип:

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

Я уточню вопрос, но я не особо забочусь о преобразовании int16_t в uint16_t. Я получал возможность присвоить тип не в варианте (т. Е. Ничего не uintXX_t) – MrJman006

+0

Вы не получали этого. Даже с «уточненным» вопросом. В чем вопрос о назначении фиктивных ценностей в вариант? Почему вы ожидаете его компиляции? Что делать? Вы ищете 'boost :: any'? (Если так - это запах дизайна 99% времени, так: почему?) – sehe

Смежные вопросы