Problem with simple type extraction
Hi there, I cannot understand why the code below gives me a static
assertion. As far as I know I use a very common technique to to
extract a type from templated class using specialization over this
class.
#include
Hi Christian,
On Mon, Aug 16, 2010 at 8:49 AM, Christian Henning
Hi there, I cannot understand why the code below gives me a static assertion. As far as I know I use a very common technique to to extract a type from templated class using specialization over this class.
I was surprised that this didn't work as well. After some investigation, I found that adding a 'const' to the specialization worked for me:
template< typename BitField, typename ChannelBitSizes, typename Layout, bool IsMutable > struct bit_field_type* change here*/ const bit_aligned_pixel_reference< BitField , ChannelBitSizes , Layout , IsMutable > > { typedef BitField type; };
It wasn't working because the unspecialized bit_field_type was getting instantiated instead. HTH, Nate
Hi Nathan,
On Mon, Aug 16, 2010 at 12:09 PM, Nathan Crookston
Hi Christian,
On Mon, Aug 16, 2010 at 8:49 AM, Christian Henning
wrote: Hi there, I cannot understand why the code below gives me a static assertion. As far as I know I use a very common technique to to extract a type from templated class using specialization over this class.
I was surprised that this didn't work as well. After some investigation, I found that adding a 'const' to the specialization worked for me:
It works for me now too. Any idea why that is? Thank you very much! I have spend way too much time for these couple of lines of code. ;-) Christian
On Mon, Aug 16, 2010 at 12:32 PM, Christian Henning
It works for me now too. Any idea why that is?
Well, apparently the reference type is declared as const somewhere in
the GIL code (not the referenced pixel, of course). I tried to find
exactly where the const was added in the code, but I had some trouble
following all the many metafunction instantiations, etc -- there are
quite a few for the declaration given.
I did modify the metafunction slightly to give correct results
regardless of const (and volatile) qualifiers. Perhaps it would be of
use to you:
//In addition to previous includes
#include
Hi Nathan,
On Mon, Aug 16, 2010 at 3:15 PM, Nathan Crookston
On Mon, Aug 16, 2010 at 12:32 PM, Christian Henning
wrote: It works for me now too. Any idea why that is?
Well, apparently the reference type is declared as const somewhere in the GIL code (not the referenced pixel, of course). I tried to find exactly where the const was added in the code, but I had some trouble following all the many metafunction instantiations, etc -- there are quite a few for the declaration given.
I did not think of const since I thought there is gray1_image_t::view_t::const_reference. Turns out there isn't a const_reference. And maybe I got fooled by the MSVC debugger which told me that there is no const in actual type of gray1_image_t::view_t::reference.
I did modify the metafunction slightly to give correct results regardless of const (and volatile) qualifiers. Perhaps it would be of use to you:
//In addition to previous includes #include
namespace boost { namespace gil {
template< typename T > struct bit_field_type_impl { typedef T type; };
template< typename BitField, typename ChannelBitSizes, typename Layout, bool IsMutable > struct bit_field_type_impl< bit_aligned_pixel_reference< BitField , ChannelBitSizes , Layout , IsMutable > > { typedef BitField type; };
template< typename T > struct bit_field_type : bit_field_type_impl
{}; } // namespace gil } // namespace boost
Thanks alot for your code suggestions I'll incorporate them into my code. Regards, Christian
participants (2)
-
Christian Henning
-
Nathan Crookston