Re: static data members in template class problem
On 2007-07-19 18:02, mati wrote:
Hi,
Following code gives a linker error:
test.obj : error LNK2001: unresolved external symbol "public: static int
const BresenhamCircle<2>::SIZE"
template <int R>
class BresenhamCircle
{
public:
static const int SIZE;
};
template <int R>
class Test
{
BresenhamCircle<R> circle;
public:
int testfunction();//[1] { return circle.SIZE+1000*R; }
{ return BresenhamCircle<R>::SIZE+1000*R }
};
template<int R>
int Test<R>::testfunction()
{
return circle.SIZE+1000*R;
return BresenhamCircle<R>::SIZE+1000*R;
}
template<int R> const int BresenhamCircle<R>::SIZE = -1;
const int BresenhamCircle<4>::SIZE = 4;
template<> const int BresenhamCircle<4>::SIZE = 4;
#include <iostream>
int main()
{
Test<2> obj;
//[2] Test<4> obj;
std::cout<<obj.testfunction()<<std::endl;
}
And two interesting things happen:
[1] - code compiles and links without errors when we make the
testfunction() inline.
[2] - all is ok for specialized versions;
I'm learning c++, and I have no idea if I'm wrong, or the compiler has a
bug, but I suppose the latter since gcc(3.3.6) compiles this code just
fine (or maybe it is UB?). I do not understand why the behaviour is
different for inline and non-inline functions.
Might be a bug, or just gcc allowing the user to get away with faulty
code, did out use the -std=c++89 -pedantic options? Anyway, SIZE being a
static member you can access it through the class name instead of the
instance.
--
Erik Wikstr?m