Boost logo

Boost Users :

Subject: Re: [Boost-users] BOOST_STATIC_CONST
From: Manfred Doudar (manfred.doudar_at_[hidden])
Date: 2010-03-13 14:28:18


On Sat, 13 Mar 2010 19:58:00 +0100
Olivier Tournaire <olitour_at_[hidden]> wrote:

> 2010/3/13 Manfred Doudar <manfred.doudar_at_[hidden]>
>
> > On Sat, 13 Mar 2010 09:43:18 +0100
> > Olivier Tournaire <olitour_at_[hidden]> wrote:
> >
> > > Thank you Steven,
> > >
> > > 2010/3/13 Steven Watanabe <watanabesj_at_[hidden]>
> > >
> > > > AMDG
> > > >
> > > >
> > > > Olivier Tournaire wrote:
> > > >
> > > >> I am currently having problem with a static const class member
> > > >> (in a header
> > > >> only project):
> > > >>
> > > >> // type.hpp
> > > >> template< typename Property >
> > > >> struct property_base
> > > >> {
> > > >> typedef Property type;
> > > >> };
> > > >>
> > > >> struct some_type : property_base< uint32_t >
> > > >> {
> > > >> BOOST_STATIC_CONSTANT( type, first_value = 1 );
> > > >> BOOST_STATIC_CONSTANT( type, second_value = 2 );
> > > >> };
> > > >>
> > > >> // main.cpp
> > > >> #include "type.hpp"
> > > >> ...
> > > >> int main(int argc, char** argv)
> > > >> {
> > > >> BOOST_CHECK_EQUAL( 1 , some_type::first_value );
> > > >> }
> > > >>
> > > >> This produces a link error (g++ 4.3.4): undefined reference to
> > > >> some_type::first_value. Everything is fine with visual ...
> > > >>
> > > >> If I add const some_type::type some_type::first_value; after
> > > >> the struct definition, it compiles and links fine. However,
> > > >> would it produce a multiple
> > > >> definition link error in some cases?
> > > >> Could you please help?
> > > >>
> > > >>
> > > >
> > > > Putting the definition in a header can indeed cause a multiple
> > > > definition error. The definition needs to be in a cpp file.
> > > >
> > >
> > > Is there an other way to do that? I want the project to stay
> > > header only so I cannot introduce a cpp file.
> > > Are they some metaprogramming techniques that could lead to the
> > > same behavior?
> > >
> >
> > Is "extern" what you are looking for?
> >
>
> Maybe. However, I am not sure. I still have to provide a definition
> of the member somewhere. Where should I do this (in a header only
> project ...)?
>
> >
> > extern const some_type::type some_type::first_value;
> >

If you add the line above (extern ...) just after your struct
some_type in type.h, works for me.

Cheers,

-- 
Manfred

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net