2015-08-02 7 views
0

Я определяю свой собственный variant типа так:Ни один матча для оператора * при использовании подталкивания :: вариант

typedef variant<myobj **, ... other types> VariantData; 

Один из моих методов класса получает этот тип данных в качестве параметра и пытается сделать что-то вроде:

void MyMethod(VariantData var){ 
    //method body 
    if(some_cond){ // if true, then it implies that var is of type 
        // myobj ** 
     do_something(*var); // however, I'm unable to dereference it 
    } 
    // ... ther unnecessary stuff 
} 

в результате, когда я скомпилировать свою программу, я получаю сообщение об ошибке:

error: no match for 'operator*' (operand type is 'VariantData ....' 

я делаю п ot знать, как исправить эту ошибку. PS. В целом код работает хорошо - если я прокомментирую эту часть, связанную с разыменованием, тогда все пройдет гладко.

+0

Вы не можете разыменовать 'boost :: variant'. Используйте [статический посетитель] (http://www.boost.org/doc/libs/1_58_0/doc/html/variant.html#variant.motivation) или [get()] (http: //www.boost. org/doc/libs/1_58_0/doc/html/boost/get_idp295310448.html), которая извлекает значение –

+0

. Думаю, если вы немного поработаете над этим, вы можете сделать ответ. Я буду признателен и признаю это. – Jacobian

+0

Документация не представляется достаточно информативной, особенно с точки зрения примеров. Что касается меня, я думаю, что функция 'get' мне подходит лучше, но я не могу понять из документации, как ее использовать. – Jacobian

ответ

1

Сообщение об ошибке довольно понятно: вы не можете разыскивать boost::variant, у него нет такой семантики. Сначала вы должны извлечь значение, то есть указатель, а затем разыщите его.

Чтобы извлечь значение, опираясь на время выполнения логики, просто позвоните получить():

//method body 
if(some_cond){ // if true, then it implies that var is of type myobj ** 
    do_something(*get<myobj **>(var)); 
} 

Однако следует отметить, что если во время выполнения логики не удается (например, из-за ошибки.) get() будет выбрасывать bad_get исключение.

+0

Спасибо, сэр! – Jacobian