This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: symbols not resolved... symbols not generated?


Brian Budge <brian.budge@gmail.com> writes:

> I'm running into an issue using static const variables in my template
> class, but only with -O0.  I have something like this:
>
> Bar.h
>
> template <typename Foo>
> class Bar {
> ...
> public:
>   typedef uint32_t SomeType;
>   static const SomeType A = 0;
>   static const SomeType B = 1;
>   static const SomeType C = 2;
> ...
> };
>
> These types are used in Bar member functions, as well as by Foo (who
> knows who he is an argument for).
>
> In -O1 and above, it looks like the symbols are never generated, and
> this is fine since it's probably folded into the code.  In O0, which
> I'm using for debugging, the symbols appear in my object file as 'U'
> (unresolved).

The declaration of a const in a class is only a declaration.  You also
need a definition.  The current C++ standard says that the definition is
always required, but that in some cases an implementation need not
diagnose it.  The new C++ standard will relax this in some cases, but
gcc does not yet implement that.

That is, in some .cc file, you need to do

const SomeType Bar::A;
const SomeType Bar::B;
...

Note that since the const was initialized in the declaration, it should
not be initialized in the definition.

Ian


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]