[Bug c++/45082] Static const signed int class member causes undefined symbol.
--- 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.
--- 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.
--- 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.
--- 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.
--- 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.
--- 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