[Bug c++/45082] Static const signed int class member causes undefined symbol.

2010-07-27 Thread rwitmer at xmission dot com


--- Comment #5 from rwitmer at xmission dot com  2010-07-27 15:27 ---
Thanks for all the great comments and insight.

I'm still confused as to why when the BUFF_SIZE was defined as:
static const   signed int BUFF_SIZE = 20;
it caused the error, but when it was defined as:
static const unsigned int BUFF_SIZE = 20;
it did not.

void funky(const int in) is an example of a library call I had to use, I have
no control over the author's over zealousness on using a const int parameter.

There were 2 things that solved the problem I was seeing:

1. Adding a const   signed int BUFF_SIZE; line to the .cpp file.  

I've seen lots of code where we define constants ala, static const int
BUFF_SIZE=20; in the .hpp file without any const int myclass::BUFF_SIZE; in the
.cpp files.  Is that wrong to exclude them, should we be including them in the
.cpp file?

2. Declaring the type during the call, ala, funky((int)myclass::BUFF_SIZE);

I'm not sure which is the better solution.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45082



[Bug c++/45082] Static const signed int class member causes undefined symbol.

2010-07-27 Thread redi at gcc dot gnu dot org


--- Comment #6 from redi at gcc dot gnu dot org  2010-07-27 23:54 ---
(In reply to comment #5)
 Thanks for all the great comments and insight.
 
 I'm still confused as to why when the BUFF_SIZE was defined as:
 static const   signed int BUFF_SIZE = 20;
 it caused the error, but when it was defined as:
 static const unsigned int BUFF_SIZE = 20;
 it did not.

Because you can't bind const int to an unsigned int, so a temporary is created
and the reference bound to that.  When the variable has type int the reference
can bind to it directly.


 There were 2 things that solved the problem I was seeing:
 
 1. Adding a const   signed int BUFF_SIZE; line to the .cpp file.  
 
 I've seen lots of code where we define constants ala, static const int
 BUFF_SIZE=20; in the .hpp file without any const int myclass::BUFF_SIZE; in 
 the
 .cpp files.  Is that wrong to exclude them, should we be including them in the
 .cpp file?

Yes, if the variable is used in the program, see the reference from the
standard that Jakub posted days ago in comment 1

 2. Declaring the type during the call, ala, funky((int)myclass::BUFF_SIZE);

You might have misunderstood that as well, there's no declaring the type
there, it's creating a temporary which the reference binds to.

 I'm not sure which is the better solution.

Again, please follow up somewhere else, GCC's bugzilla is not the right place
to learn the rules of C++.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45082



[Bug c++/45082] Static const signed int class member causes undefined symbol.

2010-07-26 Thread jakub at gcc dot gnu dot org


--- Comment #1 from jakub at gcc dot gnu dot org  2010-07-26 15:32 ---
This is not valid C++.  See [class.static.data]/4:
If a static data member is of const integral or const enumeration type, its
declaration in the class definition can specify a constant-initializer which
shall be an integral constant expression (5.19). In that case, the member can
appear in integral constant expressions within its scope. The member shall
still be defined in a namespace scope if it is used in the program and the
namespace scope definition shall not contain an initializer.

Your testcase doesn't have the needed 
const int myclass::BUFF_SIZE;
anywhere.


-- 

jakub at gcc dot gnu dot org changed:

   What|Removed |Added

 Status|UNCONFIRMED |RESOLVED
 Resolution||INVALID


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45082



[Bug c++/45082] Static const signed int class member causes undefined symbol.

2010-07-26 Thread rwitmer at xmission dot com


--- Comment #2 from rwitmer at xmission dot com  2010-07-26 15:59 ---
I agree with your assessment.  Adding const int myclass::BUFF_SIZE; resolves
the issue. 

The bug/feature may be that re-typing BUFF_SIZE to static const unsigned int
allows the compiler to not report a problem.  It doesn't require a const
unsigned myclass::BUFF_SIZE; anywhere and still compiles when it shouldn't.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45082



[Bug c++/45082] Static const signed int class member causes undefined symbol.

2010-07-26 Thread redi at gcc dot gnu dot org


--- Comment #3 from redi at gcc dot gnu dot org  2010-07-26 16:32 ---
(In reply to comment #2)
 The bug/feature may be that re-typing BUFF_SIZE to static const unsigned int
 allows the compiler to not report a problem.

You're not re-typing it, you're providing a definition for a variable that
was previously only declared, not defined.

  It doesn't require a const
 unsigned myclass::BUFF_SIZE; anywhere 

Yes it does, it requires it where you bind a reference to the variable.

If you only want it to be used as an integral constant, don't use it in a
context that requires a variable (e.g. reference binding)

 and still compiles when it shouldn't.

There are dozens of (invalid) bug reports in bugzilla about this, feel free to
search for more details.
The compiler must not reject your program as it doesn't know until link time
that you've failed to define the symbol. It could be defined in some other
object or library that you link to later.

The bug was in your program, not the compiler.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45082



[Bug c++/45082] Static const signed int class member causes undefined symbol.

2010-07-26 Thread redi at gcc dot gnu dot org


--- Comment #4 from redi at gcc dot gnu dot org  2010-07-26 16:37 ---
(In reply to comment #3)
 
 If you only want it to be used as an integral constant, don't use it in a
 context that requires a variable (e.g. reference binding)

e.g.
   funky((int)myclass::BUFF_SIZE);

This means the reference binds to a temporary, not to your class variable, and
therefore the compiler only needs the value of BUFF_SIZE, not it's definition.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45082