Consider the following C++ source code files =========> testLib.h <=========== #include <stdexcept> #include <iostream>
#define DEBUG1(X) std::cout<<X; typedef int IndexType; namespace Upagraha { template<typename X,int Size> class CompileTimeFixedSizeData { protected: X _data[Size]; //!< The storage of the data static IndexType _size; //!< The size of the data. public: CompileTimeFixedSizeData() { DEBUG1("Template value = "<< Size << std::endl); DEBUG1("Static variable value = "<< _size<< std::endl); } virtual ~CompileTimeFixedSizeData() {} }; //setting the value of _size, which is static template<typename X,int Size> IndexType CompileTimeFixedSizeData<X,Size>::_size=Size; /** Create an instance of CompileTimeFixedSizeData and associated functions. */ #define COMPILE_TIME_FIXED_SIZE_DATA_INSTANCE(TYPE,SIZE) \ template class CompileTimeFixedSizeData<TYPE,SIZE>; } =========> testLib.cpp <=========== #include "testLib.h" namespace Upagraha { COMPILE_TIME_FIXED_SIZE_DATA_INSTANCE(double,3) } =========> main.cpp <=========== #include "testLib.h" namespace Upagraha { //extern template class CompileTimeFixedSizeData<double,3>; // FIXME: Uncomment to see a change in behavior } int main() { Upagraha::CompileTimeFixedSizeData<double,3> a; } =========> makefile <=========== #OPTIONS=-rdynamic -fno-implicit-templates -fPIC OPTIONS=-rdynamic -fno-implicit-templates # FIXME: Uncomment the top one to see change in behaviour test:libtestLib.so testLib.h main.cpp g++ $(OPTIONS) $(TOPTIONS) main.cpp -L"${PWD}" -ltestLib -o main libtestLib.so: testLib.cpp testLib.h g++ $(OPTIONS) $(TOPTIONS) -shared testLib.cpp -o libtestLib.so clean: rm main libtestLib.so *~ ==================================== Put the above four files in same the directory and do the following *) make *) export LD_LIBRARY_PATH="$PWD" *) ./main You'll see the output as ===================== Template value = 3 Static variable value = 0 ===================== Now, follow either of the two "FIXME"s and build the program and run to get ===================== Template value = 3 Static variable value = 3 ===================== Why this difference in behaviour in initialisation of static variable Upagraha::CompileTimeFixedSizeData<X,Size>::_size? Could somebody please explain this? -- Summary: Static members not initialised in explicit template instances of library Product: gcc Version: 4.4.4 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: hlprasu at gmail dot com GCC build triplet: i686-redhat-linux GCC host triplet: i686-redhat-linux GCC target triplet: i686-redhat-linux http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44855