Björn Pollex
Björn Pollex

Reputation: 76828

Cannot get simplest Phoenix lambda to compile

I am currently trying to get the following very simple boost::phoenix::lambda to compile:

#include <iostream>

#include <boost/phoenix/scope.hpp>

int main() {
    boost::phoenix::lambda[std::cout << "Lambda!!"]();
}

However, this generates a host of errors (too much to post here), none which make any sense to me. Here is an excerpt of the compiler output:

error: 'std::ios_base::ios_base(const std::ios_base&)' is private 
       within this context
error: initializer for 
       'boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, 
        boost::proto::argsns_::term<boost::phoenix::vector0<> >, 0l>::proto_child0 
        {aka boost::phoenix::vector0<>}' must be brace-enclosed

I am compiling these using MinGW 4.7.2 on Windows XP with Boost 1.53.0. What am I doing wrong?

Upvotes: 1

Views: 186

Answers (1)

sehe
sehe

Reputation: 393114

Firstly, always

#include <boost/phoenix/phoenix.hpp>

unless you know what you're doing.

Secondly, you need to make either operand of operator<< be a phoenix terminal, otherwise, it will be just

std::cout << "Lambda!!"

which is an expression of type std::ostream&...

Now, you could do anything, really, e.g.

phx::ref(std::cout) << "Lambda!!"

or

std::cout << phx::val("Lambda!!")

Either will compile.

Upvotes: 4

Related Questions