Mail Archives: djgpp/2006/01/21/14:46:08
| X-Authentication-Warning:  | delorie.com: mail set sender to djgpp-bounces using -f
 | 
| From:  | "Alon Neubach" <alonneubach AT gmail DOT com>
 | 
| 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:  | <newscache$3djgti$vp7$1@news.actcom.co.il>
 | 
| 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<int>::_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 T>
class B
{
public:
    static A _a;
};
template <> A B<int>::_a; //This line causes a linker error
int main(int argc, char* argv[])
{
    B<int>::_a.foo();
    return 0;
}
(end of program)
When I chage the problematic line to this:
template <> A B<int>::_a(0); //This uses A's second ctor
or this:
template <> A B<int>::_a = A(); //Use A's default ctor explicitly
The problem disappears...
Thanks,
    Alon 
- Raw text -