FIX: LNK2001 Incorrectly Generated for Static Data MemberLast reviewed: September 19, 1997Article ID: Q149784 |
4.00
WINDOWS NT
kbtool kbbuglist kbfixlist
The information in this article applies to:
SYMPTOMSWhen declaring static members of C++ classes, you must initialize the static data member. Otherwise the linker generates an unresolved external error message. Visual C++ 4.0 incorrectly generates such an unresolved external error message if a storage-class specifier (such as __declspec(X)) is used on the initialization line of a static data member.
CAUSEStorage-class specifiers, such as __declspec(), are only necessary for declarations. They are not needed (but are not wrong) otherwise.
RESOLUTIONRemove the storage-class specifier.
STATUSMicrosoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This problem has been corrected in Microsoft Visual C++ version 4.1.
MORE INFORMATIONEarlier versions of Visual C++ generated the following error when a storage- class specifier is used on the initialization line: C:test.cpp('line') : error C2720: 'idata' : '' storage-class specifier illegal on memberswhere 'line' is the line of code where the initialization takes place, and 'idata' is the name of the static data member. Visual C++ no longergenerates the C2720 error (correctly so). The following sample code demonstrates the problem.
Sample Code
/* Compile options needed: none */ #include <iostream.h> #include <stdio.h>class A { public: static __declspec(thread) int idata; void test(void);}; __declspec(thread) int A::idata = 2; // remove this __declspec(thread) to // eliminate unresolved externalerror
void A::test(void){ cout<<idata;}
void main(void){ A theA; theA.test();}
|
Additional reference words: 4.00 lnk2001 lnk1120 L2029 unresolved external
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |