X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f From: "Alon Neubach" Newsgroups: comp.os.msdos.djgpp Subject: template specialization problem Lines: 57 X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2900.2180 X-RFC2646: Format=Flowed; Original X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180 X-NNTP-Posting-Host: l85-130-135-131.broadband.actcom.net.il Message-ID: Date: Sat, 21 Jan 2006 21:24:03 +0200 NNTP-Posting-Host: 192.114.47.10 X-Complaints-To: abuse AT verio DOT net X-Trace: newsread1.mlpsca01.us.to.verio.net 1137871625 192.114.47.10 (Sat, 21 Jan 2006 19:27:05 GMT) NNTP-Posting-Date: Sat, 21 Jan 2006 19:27:05 GMT Organization: NTT/VERIO To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com Hi I'm using DJGPP C++ compiler version 4.01. I tried compiling this program, that uses a static data member in a template: I tried to declare the data member in a specialization of the template B (to an int for example). The data member is of type A, which is a class. The funy thing is, when I declare the member outside the class with A's default constructor, I get a linker error: "undefined reference to `B::_a'", but when I use A's constructor that receives a parameter, the problem disappears. Also, if I assign a new A object to the member, using "a = A()", the problem also disappears - see in code below. Note that the same thing happens if the member is of internal type - then it can be solved only by assigning it with an initial value. I did manage to get the original program to compile and link in Visual Studio 6, so I was wondering if this was a bug in the compiler, or is this supposed to be the behavior of the language? This is the (simplified) program I tried compiling - all in one cpp file: class A { public: A() {} A(int dummy) {} void foo() {} }; template class B { public: static A _a; }; template <> A B::_a; //This line causes a linker error int main(int argc, char* argv[]) { B::_a.foo(); return 0; } (end of program) When I chage the problematic line to this: template <> A B::_a(0); //This uses A's second ctor or this: template <> A B::_a = A(); //Use A's default ctor explicitly The problem disappears... Thanks, Alon