2013-12-16 3 views
4

Этот простой пример кода для повышающего :: варианта и повышение :: apply_visitor:подталкивания ошибка вариант apply_visitor компиляции

#include <boost/variant/recursive_variant.hpp> 

struct ExprFalse; 
struct ExprTrue; 
struct ExprMaybe; 

typedef boost::variant< 
    ExprFalse, 
    ExprTrue, 
    ExprMaybe 
    > Expression; 

struct ExprFalse { }; 
struct ExprTrue { }; 
struct ExprMaybe { }; 

struct Printer : public boost::static_visitor<> 
{ 
public: 
    Printer(std::ostream& os) : m_os(os) { } 
    void operator()(ExprFalse const& expr) const { m_os << "False"; } 
    void operator()(ExprTrue const& expr) const { m_os << "True"; } 
    void operator()(ExprMaybe const& expr) const { m_os << "Maybe"; } 

private: 
    std::ostream& m_os; 
}; 

int main() 
{ 
    Expression e(ExprTrue()); 
    boost::apply_visitor(Printer(std::cout), e); 
    return 0; 
} 

Выдает следующую ошибку компиляции:

g++-mp-4.8 -MMD -DBOOST_ALL_DYN_LINK -DBOOST_SPIRIT_USE_PHOENIX_V3 -Wall -std=c++11 -Os -O3 -g -I/o\ 
pt/local/include -I./ -c tools/t6.cpp -o tools/build/x86_64/objs/t6.o 
In file included from /opt/local/include/boost/variant/apply_visitor.hpp:16:0, 
       from /opt/local/include/boost/variant/detail/hash_variant.hpp:23, 
       from /opt/local/include/boost/variant/variant.hpp:37, 
       from /opt/local/include/boost/variant/recursive_variant.hpp:36, 
       from tools/t6.cpp:4: 
/opt/local/include/boost/variant/detail/apply_visitor_unary.hpp: In instantiation of 'typename Visi\ 
tor::result_type boost::apply_visitor(const Visitor&, Visitable&) [with Visitor = Printer; Visitabl\ 
e = boost::variant<ExprFalse, ExprTrue, ExprMaybe>(ExprTrue (*)()); typename Visitor::result_type =\ 
void]': 
tools/t6.cpp:35:47: required from here 
/opt/local/include/boost/variant/detail/apply_visitor_unary.hpp:76:43: error: request for member 'a\ 
pply_visitor' in 'visitable', which is of non-class type 'boost::variant<ExprFalse, ExprTrue, ExprM\ 
aybe>(ExprTrue (*)())' 
    return visitable.apply_visitor(visitor); 
             ^
/opt/local/include/boost/variant/detail/apply_visitor_unary.hpp:76:43: error: return-statement with\ 
a value, in function returning 'void' [-fpermissive] 
make: *** [tools/build/x86_64/objs/t6.o] Error 1 

На Mac OSX Mavericks с помощью Повысьте версии 1.55.0.

Для жизни меня я не могу решить проблему. Я попытался на самом деле иметь тип возврата (даже если посетитель печати не нуждается в нем), но в итоге я получил ту же ошибку.

Любое понимание будет оценено по достоинству.

ответ

6

Вы попали в поле управления most vexing parse: e - фактически функция. Добавьте дополнительную пару круглых скобок:

Expression e((ExprTrue())); 
+0

Именно поэтому {} инициализация была добавлена ​​в C++ 11? Выражение e {ExprTrue()}; –

+1

@Ben Hobbs хорошо, он был добавлен для унификации различных форм инициализации, в общем. –

+0

@Igor R. Спасибо. Я был вне дорог, и это спасло меня много времени и обострения. – RandomBits

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