Jens, I have attached a full example now. I have included my questions and error snips from the compiler output within the source.
I'm wondering why you call _1 on the functor in all, especially the last example. Probably because I do not know what I am doing. I still get an error whether I do that or not. See attached example.
What's the derefenrencing for? Are you sure the first one works as you intend? Or does it merely compile? scoped_ptr<T>::get returns a T* so I dereference it before operator<< is called. The behavior works as intended, the operator<< for T is called.
Thanks, Matt #include <algorithm> #include <iostream> #include <vector> #include <string> #include <boost/lambda/lambda.hpp> #include <boost/lambda/bind.hpp> #include <boost/scoped_ptr.hpp> #include <boost/scoped_array.hpp> using namespace std; using namespace boost; using namespace boost::lambda; int main(int argc, char** argv) { vector<char> t(10); scoped_array<scoped_ptr<int> > v(new scoped_ptr<int>[10]); //I know this is not typical to //initialize this way for (int k(0); k < 10; ++k) { v[k].swap(scoped_ptr<int>(new int(k))); } //Works fill(t.begin(), t.end(), 'b'); for_each(t.begin(), t.end(), cout << _1 << '\n'); /* Doesnt work? for_each(t.begin(), t.end(), cout << _1 << endl); Error 1 error C2784: 'std::basic_ostream<_Elem,_Traits> &std::operator <<(std::basic_ostream<_Elem,_Traits> &,const std::basic_string<_Elem,_Traits,_Alloc> &)' : could not deduce template argument for 'std::basic_ostream<_Elem,_Traits> &' from 'const boost::lambda::lambda_functor<T>' d:\source\c\testlambda\testlambda\main.cpp 29 */ cout << endl; int q(0); //Works /* 0 1 2 3 4 5 6 7 8 9 */ for (int i(0); i < 10; ++i) { cout << *(v[i].get()) << endl; } cout << endl; //Doesnt work //for_each(&v[0], &v[0] + 10, cout << *bind(&scoped_ptr<string>::get, _1) << '\n'); /* Error 1 error C2665: 'boost::lambda::function_adaptor<Func>::apply' : none of the 2 overloads could convert all the argument types D:\boost_1_33_1\boost\lambda\detail\actions.hpp 87 */ //Doesnt work //for_each(&v[0], &v[0] + 10, cout << *bind(&scoped_ptr<string>::get, _1)(_1) << '\n'); /* Error 1 error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>' D:\Microsoft Visual Studio 8\VC\include\ostream 581 */ //Works, how does it know to bind correctly? /* 0 1 2 3 4 5 6 7 8 9 */ for_each(&v[0], &v[0] + 10, cout << *(&scoped_ptr<string>::get, _1) << '\n'); return 0; }