[RangeEx] Using istream_range?

Hi All I'd really appreciate an example of the use of istream_range from the Boost.Range library. I tried this #include <iostream> #include <iterator> #include "boost/range.hpp" #include "boost/range/istream_range.hpp" #include "boost/range/algorithm.hpp" void f( int i ) { std :: cout << i << std :: endl; } int main( ) { typedef std :: istream_iterator< int > in; boost :: for_each( boost :: istream_range< in >( std :: cin ), f ); return 0; } and other variations, but I don't think any of them are right! Do I really have to specify three template type parameters? The signature of the template is namespace boost { template<class Type, class Elem, class Traits> inline range<std::istream_iterator<Type, Elem, Traits> > istream_range(std::basic_istream<Elem, Traits>& in) { return range<std::istream_iterator<Type, Elem, Traits> >( std::istream_iterator<Elem>(in), std::istream_iterator<Elem>()); } } Thanks, Rob.

Hi Robert, You only have to supply one template parameter because the others will be deduced. The first template parameter is the same as for istream_iterator, it is the 'int' in your case. On Tue, Oct 21, 2008 at 8:54 AM, Robert Jones <robertgbjones@gmail.com>wrote:
Hi All
I'd really appreciate an example of the use of istream_range from the Boost.Range library.
I tried this
#include <iostream> #include <iterator> #include "boost/range.hpp" #include "boost/range/istream_range.hpp" #include "boost/range/algorithm.hpp"
void f( int i ) { std :: cout << i << std :: endl; }
int main( ) {
This is incorrect...
typedef std :: istream_iterator< int > in; boost :: for_each( boost :: istream_range< in >( std :: cin ), f );
It is even easier than that... boost::for_each(boost::istream_range<int>(std::cin), f);
return 0; }
and other variations, but I don't think any of them are right! Do I really have to specify three template type parameters? The signature of the template is
<snip> </snip> And an example would be my super hurried test code that i haven't submitted yet because it needs tidying: #include <string> #include <sstream> #include <boost/range/istream_range.hpp> namespace boost { inline void test_istream_range() { std::string data("test"); std::vector<char> reference; std::istringstream reference_s(data); std::copy(std::istream_iterator<char>(reference_s), std::istream_iterator<char>(), std::back_inserter(reference)); std::vector<char> test; std::istringstream test_s(data); copy(istream_range<char>(test_s), std::back_inserter(test)); BOOST_CHECK( reference == test ); } } // namespace boost Thanks, Rob.
_______________________________
You are very welcome. I hope this helps. Let me know how you get on. Best Wishes, Neil Groves

On Tue, Oct 21, 2008 at 9:24 AM, Neil Groves <neil@grovescomputing.com>wrote:
Hi Robert,
You are very welcome. I hope this helps. Let me know how you get on.
Badly! IIRC your code was pretty much the first thing I tried, which I have just tried again and generated this error message $ g++ -I.. -o junk.exe junk.cpp ../boost/range/istream_range.hpp: In function `boost::range<std::istream_iterator<Type, Elem, Traits, ptrdiff_t> > boost ::istream_range(std::basic_istream<_CharT, _Traits>&) [with Type = int, Elem = char, Traits = std::char_traits<char>]': junk.cpp:14: instantiated from here ../boost/range/istream_range.hpp:28: error: no matching function for call to `boost::range<std::istream_iterator<int, ch ar, std::char_traits<char>, ptrdiff_t> >::range(std::istream_iterator<char, char, std::char_traits<char>, ptrdiff_t>, st d::istream_iterator<char, char, std::char_traits<char>, ptrdiff_t>)' junk.cpp:14: note: candidates are: boost::range<std::istream_iterator<int, char, std::char_traits<char>, ptrdiff_t> >::r ange(const boost::range<std::istream_iterator<int, char, std::char_traits<char>, ptrdiff_t> >&) ../boost/range/range.hpp:162: note: boost::range<Iter>::range(Iter, Iter) [with Iter = std::istream_iterator<int, char, std::char_traits<char>, ptrdiff_t>] ../boost/range/range.hpp:155: note: boost::range<Iter>::range() [with Iter = std::istream_iterator<int, char, std::char _traits<char>, ptrdiff_t>] Just in case I'm having a blind moment (not uncommon I might add) I'm also attaching the full source, cut and pasted for accuracy #include <iostream> #include <iterator> #include "boost/range.hpp" #include "boost/range/istream_range.hpp" #include "boost/range/algorithm.hpp" void f( int i ) { std :: cout << i << std :: endl; } int main( ) { boost :: for_each( boost :: istream_range< int >( std :: cin ), f ); return 0; } If it matters the compiler spec is $ g++ --version g++ (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) Copyright (C) 2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Thanks for your help Neil. - Rob.

Hey Robert, I'm going to look at this problem ronight, if it's possible to sneak this into my lunch-break I'll try it out on my GCC 4.x on the Mac. I don't think I have a GCC 3.x to hand. If I find it's ok on GCC 4.x I will endeavour to get GCC 3.x installed somewhere. I apologise for the disruption caused by this issue. I will attend to the matter as quickly as possible. Best Wishes, Neil Groves On Tue, Oct 21, 2008 at 9:38 AM, Robert Jones <robertgbjones@gmail.com>wrote:
On Tue, Oct 21, 2008 at 9:24 AM, Neil Groves <neil@grovescomputing.com
wrote:
Hi Robert,
You are very welcome. I hope this helps. Let me know how you get on.
Badly!
IIRC your code was pretty much the first thing I tried, which I have just tried again and generated this error message
$ g++ -I.. -o junk.exe junk.cpp ../boost/range/istream_range.hpp: In function `boost::range<std::istream_iterator<Type, Elem, Traits, ptrdiff_t> > boost ::istream_range(std::basic_istream<_CharT, _Traits>&) [with Type = int, Elem = char, Traits = std::char_traits<char>]': junk.cpp:14: instantiated from here ../boost/range/istream_range.hpp:28: error: no matching function for call to `boost::range<std::istream_iterator<int, ch ar, std::char_traits<char>, ptrdiff_t> >::range(std::istream_iterator<char, char, std::char_traits<char>, ptrdiff_t>, st d::istream_iterator<char, char, std::char_traits<char>, ptrdiff_t>)' junk.cpp:14: note: candidates are: boost::range<std::istream_iterator<int, char, std::char_traits<char>, ptrdiff_t> >::r ange(const boost::range<std::istream_iterator<int, char, std::char_traits<char>, ptrdiff_t> >&) ../boost/range/range.hpp:162: note: boost::range<Iter>::range(Iter, Iter) [with Iter = std::istream_iterator<int, char, std::char_traits<char>, ptrdiff_t>] ../boost/range/range.hpp:155: note: boost::range<Iter>::range() [with Iter = std::istream_iterator<int, char, std::char _traits<char>, ptrdiff_t>]
Just in case I'm having a blind moment (not uncommon I might add) I'm also attaching the full source, cut and pasted for accuracy
#include <iostream> #include <iterator> #include "boost/range.hpp" #include "boost/range/istream_range.hpp" #include "boost/range/algorithm.hpp"
void f( int i ) { std :: cout << i << std :: endl; }
int main( ) { boost :: for_each( boost :: istream_range< int >( std :: cin ), f ); return 0; }
If it matters the compiler spec is
$ g++ --version g++ (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) Copyright (C) 2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Thanks for your help Neil.
- Rob. _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

On Tue, Oct 21, 2008 at 9:59 AM, Neil Groves <neil@grovescomputing.com>wrote:
I apologise for the disruption caused by this issue.
I will attend to the matter as quickly as possible.
Many thanks Neil - and apologies are quite unnecessary. These little teething issues are entirely what one should expect if one insists on working with "bleeding-edge" technology. - Rob.

Hi Rob, I have uploaded what I believe to be a corrected version of istream_range. I have to confess that I have not yet been able to check this on a GCC compiler, but I think I simply had two template parameter types switched. My test case was using 'char' for both 'Type' and 'Elem' hence I did not detect the issue. I am installing Xcode as we speak on a Mac so I will in due course find out if this works on GCC. Since the change did not make things any worse I have posted it anyhow. Regards, Neil Groves On Tue, Oct 21, 2008 at 10:10 AM, Robert Jones <robertgbjones@gmail.com>wrote:
On Tue, Oct 21, 2008 at 9:59 AM, Neil Groves <neil@grovescomputing.com
wrote:
I apologise for the disruption caused by this issue.
I will attend to the matter as quickly as possible.
Many thanks Neil - and apologies are quite unnecessary. These little teething issues are entirely what one should expect if one insists on working with "bleeding-edge" technology.
- Rob. _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

On Tue, Oct 21, 2008 at 1:44 PM, Neil Groves <neil@grovescomputing.com>wrote:
Hi Rob,
I have uploaded what I believe to be a corrected version of istream_range. I have to confess that I have not yet been able to check this on a GCC compiler, but I think I simply had two template parameter types switched. My test case was using 'char' for both 'Type' and 'Elem' hence I did not detect the issue.
I am installing Xcode as we speak on a Mac so I will in due course find out if this works on GCC. Since the change did not make things any worse I have posted it anyhow.
Hi Neil Thanks for that - that now works for me! However, (sorry!), the next step, using adaptors, fails when I only include the adaptors header file. Source and error attached. #include <iostream> #include <iterator> #include "boost/range.hpp" #include "boost/range/istream_range.hpp" #include "boost/range/algorithm.hpp" #include "boost/range/adaptors.hpp" void f( int ); int main( ) { boost :: for_each( boost :: istream_range< int >( std :: cin ), f ); return 0; } $ g++ -I.. -c junk.cpp In file included from ../boost/range/adaptors.hpp:24, from junk.cpp:6: ../boost/range/adaptor/map.hpp:69: error: `transform_fn_type' was not declared in this scope ../boost/range/adaptor/map.hpp:69: error: `source_range_type' was not declared in this scope ../boost/range/adaptor/map.hpp:69: error: template argument 1 is invalid ../boost/range/adaptor/map.hpp:69: error: template argument 2 is invalid ../boost/range/adaptor/map.hpp:69: error: expected nested-name-specifier ../boost/range/adaptor/map.hpp:71: error: expected `)' before "fn" ../boost/range/adaptor/map.hpp:76: error: expected `,' or `...' before '&' token ../boost/range/adaptor/map.hpp:76: error: ISO C++ forbids declaration of `base' with no type ../boost/range/adaptor/map.hpp: In constructor `boost::range_detail::select_first_range<StdPairRng>::select_first_range( int)': ../boost/range/adaptor/map.hpp:76: error: class `boost::range_detail::select_first_range<StdPairRng>' does not have any field named `base' ../boost/range/adaptor/map.hpp:76: error: `other' undeclared (first use this function) ../boost/range/adaptor/map.hpp:76: error: (Each undeclared identifier is reported only once for each function it appears in.) ../boost/range/adaptor/map.hpp: At global scope: ../boost/range/adaptor/map.hpp:85: error: `transform_fn_type' was not declared in this scope ../boost/range/adaptor/map.hpp:85: error: `source_range_type' was not declared in this scope ../boost/range/adaptor/map.hpp:85: error: template argument 1 is invalid ../boost/range/adaptor/map.hpp:85: error: template argument 2 is invalid ../boost/range/adaptor/map.hpp:85: error: expected nested-name-specifier ../boost/range/adaptor/map.hpp:87: error: expected `)' before "fn" ../boost/range/adaptor/map.hpp:92: error: expected `,' or `...' before '&' token ../boost/range/adaptor/map.hpp:92: error: ISO C++ forbids declaration of `base' with no type ../boost/range/adaptor/map.hpp: In constructor `boost::range_detail::select_second_mutable_range<StdPairRng>::select_sec ond_mutable_range(int)': ../boost/range/adaptor/map.hpp:92: error: class `boost::range_detail::select_second_mutable_range<StdPairRng>' does not have any field named `base' ../boost/range/adaptor/map.hpp:92: error: `other' undeclared (first use this function) ../boost/range/adaptor/map.hpp: At global scope: ../boost/range/adaptor/map.hpp:101: error: `transform_fn_type' was not declared in this scope ../boost/range/adaptor/map.hpp:101: error: `source_range_type' was not declared in this scope ../boost/range/adaptor/map.hpp:101: error: template argument 1 is invalid ../boost/range/adaptor/map.hpp:101: error: template argument 2 is invalid ../boost/range/adaptor/map.hpp:101: error: expected nested-name-specifier ../boost/range/adaptor/map.hpp:103: error: expected `)' before "fn" ../boost/range/adaptor/map.hpp:108: error: expected `,' or `...' before '&' token ../boost/range/adaptor/map.hpp:108: error: ISO C++ forbids declaration of `base' with no type ../boost/range/adaptor/map.hpp: In constructor `boost::range_detail::select_second_const_range<StdPairRng>::select_secon d_const_range(int)': ../boost/range/adaptor/map.hpp:108: error: class `boost::range_detail::select_second_const_range<StdPairRng>' does not h ave any field named `base' ../boost/range/adaptor/map.hpp:108: error: `other' undeclared (first use this function) In file included from ../boost/range/adaptors.hpp:31, from junk.cpp:6: ../boost/range/adaptor/uniqued.hpp: At global scope: ../boost/range/adaptor/uniqued.hpp:37: error: expected nested-name-specifier ../boost/range/adaptor/uniqued.hpp:37: error: `adjacent_filter_range<boost::range_detail::unique_not_equal_to,ForwardRng
' specified as declarator-id ../boost/range/adaptor/uniqued.hpp:37: error: two or more data types in declaration of `adjacent_filter_range<boost::ran ge_detail::unique_not_equal_to,ForwardRng>' ../boost/range/adaptor/uniqued.hpp:37: error: expected `;' before "base" ../boost/range/adaptor/uniqued.hpp: In constructor `boost::range_detail::unique_range<ForwardRng>::unique_range(ForwardR ng&)': ../boost/range/adaptor/uniqued.hpp:40: error: class `boost::range_detail::unique_range<ForwardRng>' does not have any fi eld named `base'
Regards, Rob.

Hi Rob, These issues are resolved in the latest uploaded version. I need to check the ISO C++ specification to determine if the transform_fn_type should have been visible. It certainly compiles on many other compilers. Anyhow I think this is going to work better, and indeed there were a few places I was using 'typename' where it was not necessary. Thank you again for your feedback. Neil Groves On Tue, Oct 21, 2008 at 2:21 PM, Robert Jones <robertgbjones@gmail.com>wrote:
On Tue, Oct 21, 2008 at 1:44 PM, Neil Groves <neil@grovescomputing.com
wrote:
Hi Rob,
I have uploaded what I believe to be a corrected version of istream_range. I have to confess that I have not yet been able to check this on a GCC compiler, but I think I simply had two template parameter types switched. My test case was using 'char' for both 'Type' and 'Elem' hence I did not detect the issue.
I am installing Xcode as we speak on a Mac so I will in due course find out if this works on GCC. Since the change did not make things any worse I have posted it anyhow.
Hi Neil
Thanks for that - that now works for me!
However, (sorry!), the next step, using adaptors, fails when I only include the adaptors header file. Source and error attached.
#include <iostream> #include <iterator> #include "boost/range.hpp" #include "boost/range/istream_range.hpp" #include "boost/range/algorithm.hpp" #include "boost/range/adaptors.hpp"
void f( int );
int main( ) { boost :: for_each( boost :: istream_range< int >( std :: cin ), f ); return 0; }
$ g++ -I.. -c junk.cpp In file included from ../boost/range/adaptors.hpp:24, from junk.cpp:6: ../boost/range/adaptor/map.hpp:69: error: `transform_fn_type' was not declared in this scope ../boost/range/adaptor/map.hpp:69: error: `source_range_type' was not declared in this scope ../boost/range/adaptor/map.hpp:69: error: template argument 1 is invalid ../boost/range/adaptor/map.hpp:69: error: template argument 2 is invalid ../boost/range/adaptor/map.hpp:69: error: expected nested-name-specifier ../boost/range/adaptor/map.hpp:71: error: expected `)' before "fn" ../boost/range/adaptor/map.hpp:76: error: expected `,' or `...' before '&' token ../boost/range/adaptor/map.hpp:76: error: ISO C++ forbids declaration of `base' with no type ../boost/range/adaptor/map.hpp: In constructor `boost::range_detail::select_first_range<StdPairRng>::select_first_range( int)': ../boost/range/adaptor/map.hpp:76: error: class `boost::range_detail::select_first_range<StdPairRng>' does not have any field named `base' ../boost/range/adaptor/map.hpp:76: error: `other' undeclared (first use this function) ../boost/range/adaptor/map.hpp:76: error: (Each undeclared identifier is reported only once for each function it appears in.) ../boost/range/adaptor/map.hpp: At global scope: ../boost/range/adaptor/map.hpp:85: error: `transform_fn_type' was not declared in this scope ../boost/range/adaptor/map.hpp:85: error: `source_range_type' was not declared in this scope ../boost/range/adaptor/map.hpp:85: error: template argument 1 is invalid ../boost/range/adaptor/map.hpp:85: error: template argument 2 is invalid ../boost/range/adaptor/map.hpp:85: error: expected nested-name-specifier ../boost/range/adaptor/map.hpp:87: error: expected `)' before "fn" ../boost/range/adaptor/map.hpp:92: error: expected `,' or `...' before '&' token ../boost/range/adaptor/map.hpp:92: error: ISO C++ forbids declaration of `base' with no type ../boost/range/adaptor/map.hpp: In constructor `boost::range_detail::select_second_mutable_range<StdPairRng>::select_sec ond_mutable_range(int)': ../boost/range/adaptor/map.hpp:92: error: class `boost::range_detail::select_second_mutable_range<StdPairRng>' does not have any field named `base' ../boost/range/adaptor/map.hpp:92: error: `other' undeclared (first use this function) ../boost/range/adaptor/map.hpp: At global scope: ../boost/range/adaptor/map.hpp:101: error: `transform_fn_type' was not declared in this scope ../boost/range/adaptor/map.hpp:101: error: `source_range_type' was not declared in this scope ../boost/range/adaptor/map.hpp:101: error: template argument 1 is invalid ../boost/range/adaptor/map.hpp:101: error: template argument 2 is invalid ../boost/range/adaptor/map.hpp:101: error: expected nested-name-specifier ../boost/range/adaptor/map.hpp:103: error: expected `)' before "fn" ../boost/range/adaptor/map.hpp:108: error: expected `,' or `...' before '&' token ../boost/range/adaptor/map.hpp:108: error: ISO C++ forbids declaration of `base' with no type ../boost/range/adaptor/map.hpp: In constructor `boost::range_detail::select_second_const_range<StdPairRng>::select_secon d_const_range(int)': ../boost/range/adaptor/map.hpp:108: error: class `boost::range_detail::select_second_const_range<StdPairRng>' does not h ave any field named `base' ../boost/range/adaptor/map.hpp:108: error: `other' undeclared (first use this function) In file included from ../boost/range/adaptors.hpp:31, from junk.cpp:6: ../boost/range/adaptor/uniqued.hpp: At global scope: ../boost/range/adaptor/uniqued.hpp:37: error: expected nested-name-specifier ../boost/range/adaptor/uniqued.hpp:37: error: `adjacent_filter_range<boost::range_detail::unique_not_equal_to,ForwardRng
' specified as declarator-id ../boost/range/adaptor/uniqued.hpp:37: error: two or more data types in declaration of `adjacent_filter_range<boost::ran ge_detail::unique_not_equal_to,ForwardRng>' ../boost/range/adaptor/uniqued.hpp:37: error: expected `;' before "base" ../boost/range/adaptor/uniqued.hpp: In constructor `boost::range_detail::unique_range<ForwardRng>::unique_range(ForwardR ng&)': ../boost/range/adaptor/uniqued.hpp:40: error: class `boost::range_detail::unique_range<ForwardRng>' does not have any fi eld named `base'
Regards, Rob. _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

On Wed, Oct 22, 2008 at 12:12 AM, Neil Groves <neil@grovescomputing.com>wrote:
Hi Rob,
These issues are resolved in the latest uploaded version. I need to check the ISO C++ specification to determine if the transform_fn_type should have been visible. It certainly compiles on many other compilers. Anyhow I think this is going to work better, and indeed there were a few places I was using 'typename' where it was not necessary.
Thank you again for your feedback.
Great, thanks Neil, that all works for me now. One tiny point: the latest vault archive is called rangeex.zip, rather than the previously named range_ex.zip, which might cause some confusion. Cheers, Rob.

Hi Rob, On Wed, Oct 22, 2008 at 8:57 AM, Robert Jones <robertgbjones@gmail.com>wrote:
On Wed, Oct 22, 2008 at 12:12 AM, Neil Groves <neil@grovescomputing.com
wrote:
Hi Rob,
These issues are resolved in the latest uploaded version. I need to check the ISO C++ specification to determine if the transform_fn_type should have been visible. It certainly compiles on many other compilers. Anyhow I think this is going to work better, and indeed there were a few places I was using 'typename' where it was not necessary.
Thank you again for your feedback.
Great, thanks Neil, that all works for me now.
Super! Thank you for your time and patience. I have learned a great deal from the type of problems that were exposed. I will certainly improve the unit test coverage on multiple platforms and compilers before future submissions.
One tiny point: the latest vault archive is called rangeex.zip, rather than the previously named range_ex.zip, which might cause some confusion.
I did this incase I broke anything. Now that it is clearly superior I have replaced range_ex.zip.
Cheers, Rob.
Thank you for your assistance in making the code better. Neil Groves

Hi Neil Another one for you.... This may not be entirely due to your lib, but it is a fairly obvious use-case. This code works fine.... #include <iostream> #include <iterator> #include <list> #include "boost/range.hpp" #include "boost/range/istream_range.hpp" #include "boost/range/algorithm.hpp" #include "boost/range/adaptors.hpp" #include "boost/lambda/lambda.hpp" using namespace boost; using namespace boost :: lambda; int times_two( int i ) { return ( _1 * 2 )( i ); } int main( ) { int vals[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; copy( vals | adaptors :: transformed( times_two ), std :: ostream_iterator< int >( std :: cout, "\n" ) ); return 0; } But this code doesn't.... #include <iostream> #include <iterator> #include <list> #include "boost/range.hpp" #include "boost/range/istream_range.hpp" #include "boost/range/algorithm.hpp" #include "boost/range/adaptors.hpp" #include "boost/lambda/lambda.hpp" using namespace boost; using namespace boost :: lambda; int times_two( int i ) { return ( _1 * 2 )( i ); } int main( ) { int vals[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; copy( vals | adaptors :: transformed( _1 * 2 ), std :: ostream_iterator< int >( std :: cout, "\n" ) ); return 0; } I have sent you the full error privately as Boost bounced the file due to it being too large! Cheers, Rob.

Robert Jones wrote:
But this code doesn't....
vals | adaptors :: transformed( _1 * 2 ),
Without even testing, I assume that is because _1 * 2 does not allow the result type to be extracted using result_of. RangeEx forwards that to make_transform_iterator which requires it. I personally overcame this issue by modifying the RangeEx library so that it wraps the functor into another one that will define result_type using typeof. That's a fairly ugly hack. A better way might to be - make result_of compatible with boost.lambda sig thingy, which might or might not help in some cases - allow boost.typeof to be used in result_of, in which cases result_of will always work, albeit not reference-correctly.

Mathias Gaunard wrote:
Robert Jones wrote:
But this code doesn't....
vals | adaptors :: transformed( _1 * 2 ),
Without even testing, I assume that is because _1 * 2 does not allow the result type to be extracted using result_of. RangeEx forwards that to make_transform_iterator which requires it.
I personally overcame this issue by modifying the RangeEx library so that it wraps the functor into another one that will define result_type using typeof. That's a fairly ugly hack. A better way might to be - make result_of compatible with boost.lambda sig thingy, which might or might not help in some cases - allow boost.typeof to be used in result_of, in which cases result_of will always work, albeit not reference-correctly.
Hmm, I wonder if the current Phoenix would work? Jeff

Jeff Flinn wrote:
Hmm, I wonder if the current Phoenix would work?
Phoenix v3 would work, but that's because it uses Boost.Typeof to deduce result types in expression involving operators. That means you will need your compiler to have native support for typeof, otherwise it will only work if you register your types.

On Wed, Oct 22, 2008 at 12:12 AM, Neil Groves <neil@grovescomputing.com>wrote:
... I need to check the ISO C++ specification to determine if the transform_fn_type should have been visible.
I had a brief look at this too, and it seemed to me that transform_fn_type was perfectly validly defined and visible. Did you understand the exact nature of the compiler shortcoming that caused the error in my compiler? Regards, Rob.
participants (4)
-
Jeff Flinn
-
Mathias Gaunard
-
Neil Groves
-
Robert Jones