Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > const static member

Reply
Thread Tools

const static member

 
 
Chameleon
Guest
Posts: n/a
 
      11-03-2008
The following code produces strange errors in mingw.
Is a C++ problem or compiler problem?
----------------------------
#include <list>

class A
{
static const int B = 0;
std::list<int> lst;
void calc();
};


void A::calc()
{
lst.push_back(B); // produces 'undefined reference to A::B'
int a = B;
lst.push_back(a); // its ...ok!
}

int main() { return 0; }
----------------------------
 
Reply With Quote
 
 
 
 
sean_in_raleigh@yahoo.com
Guest
Posts: n/a
 
      11-03-2008
On Nov 3, 3:34 pm, Chameleon <(E-Mail Removed)> wrote:
> The following code produces strange errors in mingw.
> Is a C++ problem or compiler problem?
> ----------------------------
> #include <list>
>
> class A
> {
> static const int B = 0;


Sadly, the above line does not define
storage for B, but only declares it.

You also need this defined somewhere:

const int A::B;

I believe it's just working for you in the
second case because it's getting optimized
away. Compiler bug, I guess.

Sean

 
Reply With Quote
 
 
 
 
Andrey Tarasevich
Guest
Posts: n/a
 
      11-03-2008
Chameleon wrote:
> The following code produces strange errors in mingw.
> Is a C++ problem or compiler problem?


It is a problem with your code. In the C++98 specification all static
members of the class used in the program, have to be explicitly defined.
You failed to define the member, which is why from C++98 point of view
your code is ill-formed in _both_ contexts.

The revised C++ standard is more elaborate in this respect. Your
compiler's behavior is consistent with the revised specification.

> ----------------------------
> #include <list>
>
> class A
> {
> static const int B = 0;
> std::list<int> lst;
> void calc();
> };
>
>
> void A::calc()
> {
> lst.push_back(B); // produces 'undefined reference to A::B'


'push_back' method accepts its parameters by constant reference and the
parameter and argument type matches exactly in this case, which means
that in the above context the reference is bound directly to the lvalue
'A::B'. This requires a definition of 'A::B' object. You forgot to
provide one. This is why you get an error.

> int a = B;
> lst.push_back(a); // its ...ok!
> }


In this context the value of 'B' can be used as an rvalue, an integral
constant expression. There's no requirement to define 'A::B' for this
particular context.

--
Best regards,
Andrey Tarasevich
 
Reply With Quote
 
James Kanze
Guest
Posts: n/a
 
      11-03-2008
On Nov 3, 10:15*pm, (E-Mail Removed) wrote:
> On Nov 3, 3:34 pm, Chameleon <(E-Mail Removed)> wrote:


> > The following code produces strange errors in mingw. Is a
> > C++ problem or compiler problem?


Your problem. The code is not legal C++.

> > ----------------------------
> > #include <list>


> > class A
> > {
> > * * static const int B = 0;


> Sadly, the above line does not define storage for B, but only
> declares it.


> You also need this defined somewhere:


> * const int A::B;


> I believe it's just working for you in the second case because
> it's getting optimized away. *Compiler bug, I guess.


No compiler bug. Not defining a variable which has been used is
undefined behavior, so anything the compiler does with it is
fine. In practice, given a declaration which can be used as an
integral constant expression, most compilers will only require
the definition if it is used in a context where there was not an
immediate lvalue to rvalue conversion. When you use it to
initialize another int, there is an immediate lvalue to rvalue
conversion; list<int>:ush_back, on the other hand, takes a
reference, so there is no lvalue to rvalue conversion.

--
James Kanze (GABI Software) email:(E-Mail Removed)
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
const correctness - should C++ prefer const member over non-const? fungus C++ 13 10-31-2008 05:33 AM
static const T vs static T const er C++ 3 04-22-2008 10:22 PM
const vector<A> vs vector<const A> vs const vector<const A> Javier C++ 2 09-04-2007 08:46 PM
const static Vs. static const Dave C++ 10 05-22-2005 10:32 PM
About static const members appearing in another static const definitions Rakesh Sinha C++ 4 01-13-2005 08:11 AM



Advertisments