cathode26@gmail.com wrote in
news:e19651a4-3688-418d-9916-2381b2b5517b@googlegroups.com:
On Tuesday, May 15, 2007 6:17:01 AM UTC-5, mati wrote:
Hi
The following code works:
#include <vector>
class C {
private:
static const int m_static = 2;
public:
void f(const std::vector<int>& v)
{
int a = m_static;
std::vector<int> stripped(v.begin()+a, v.end());
//std::vector<int> s2(v.begin()+m_static,v.end());
}
};
int main()
{
C c;
std::vector<int> pv;
int i;
pv.push_back(i);
pv.push_back(i);
pv.push_back(i);
c.f(pv);
}
But when I erase the comment in the void f(...), then compiler
gives an error:
g++ -ansi -Wall -o test test.cpp
/tmp/cckLnGUY.o: In function `C::f(std::vector<int,
std::allocator<int>
> const&)':
test.cpp:(.text._ZN1C1fERKSt6vectorIiSaIiEE[C::f(std::vector<int,
std::allocator<int> > const&)]+0xdb): undefined reference to
`C::m_static' collect2: ld returned 1 exit status
make: *** [test] Error 1
g++ --version
g++ (GCC) 4.1.2 20060928 (prerelease) (Ubuntu 4.1.1-13ubuntu5)
Can anybody tell me what I'm doing wrong?
So I tried your code in Visual Studio and it works fine, but if you
use http://codepad.org/ your code does not compile. It is true,
this is a declaration and not a definition.
[...]
class C {
private:
static const int m_static = 2;
Yes, this is a declaration which will need a definition in some
source file somewhere. If there is no such definition, the linker may
complain or not, depending on the usage of this symbol and
optimization levels, and obviously depending on which compiler you
use.
Unfortunately, at least some MSVC versions fail to compile the
correct code with the definition added, complaining about multiply
defined symbols. So to avoid all the hassle I would suggest just to
use:
class C {
private:
enum constants {
m_static = 2
};