Boost logo

Boost :

Subject: Re: [boost] static in_class constants
From: Mateusz Loskot (mateusz_at_[hidden])
Date: 2010-03-15 10:41:21


Christian Henning wrote:
> Hi Manfred,
>
>>> Wouldn't that create multiple instances when including this header
>>> file more than one time?
>>>
>> If declared extern you ought to be fine.
>>
>> extern const int pnm_image_type::_mono_asc;
>>
>>
> Mhmm, the Windows compiler doesn't like that. This is what I tried in
> one of my header files. BTW, my lib is header only.
>
> struct pnm_image_type : property_base< uint32_t >
> {
> BOOST_STATIC_CONSTANT( type, _mono_asc = 1 ); // Monochrome ASCII encoding
> BOOST_STATIC_CONSTANT( type, _gray_asc = 2 ); // Gray level ASCII encoding
> BOOST_STATIC_CONSTANT( type, _color_asc = 3 ); // sRGB color ASCII encoding
> BOOST_STATIC_CONSTANT( type, _mono_bin = 4 ); // Monochrome binary encoding
> BOOST_STATIC_CONSTANT( type, _gray_bin = 5 ); // Gray level binary encoding
> BOOST_STATIC_CONSTANT( type, _color_bin = 6 ); // sRGB color binary encoding
> };
>
> extern const int pnm_image_type::_mono_asc;
> extern const int pnm_image_type::_gray_asc;
> extern const int pnm_image_type::_color_asc;
> extern const int pnm_image_type::_mono_bin;
> extern const int pnm_image_type::_gray_bin;
> extern const int pnm_image_type::_color_bin;
>
> The error is:
>
> error C2720: 'boost::gil::pnm_image_type::_mono_asc' : 'extern '
> storage-class specifier illegal on members
> error C2734: 'boost::gil::pnm_image_type::_mono_asc' : const object
> must be initialized if not extern
> [snip]

Yes, because C++/7.1.1 does specify this behaviour - extern can not
be used for class members.

> Olivier Tournaire suggested to use boost::mpl like this:
>
> struct pnm_image_type : property_base< uint32_t >
> {
> typedef boost::mpl::integral_c<type,1> _mono_asc;
> typedef boost::mpl::integral_c<type,2> _gray_asc;
> typedef boost::mpl::integral_c<type,3> _color_asc;
>
> typedef boost::mpl::integral_c<type,4> _mono_bin;
> typedef boost::mpl::integral_c<type,5> _gray_bin;
> typedef boost::mpl::integral_c<type,6> _color_bin;
> };
>
> This seems to work with my gcc and though I will go with this
> solution. All, I'm interested in is the value and not the actual class
> member or address to the member.

Good you've found solution.

I have question of different nature, why the names are
prefixed with underscore? Does it denote they are private,
as implementation detail, shouldn't be used as part of public
interface, any other purpose?

Best regards,

-- 
Mateusz Loskot, http://mateusz.loskot.net

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk