FIX: LNK2001 Incorrectly Generated for Static Data Member (149784)



The information in this article applies to:

  • Microsoft Visual C++, 32-bit Editions 4.0

This article was previously published under Q149784

SYMPTOMS

When 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.

CAUSE

Storage-class specifiers, such as __declspec(), are only necessary for declarations. They are not needed (but are not wrong) otherwise.

RESOLUTION

Remove the storage-class specifier.

STATUS

Microsoft 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 INFORMATION

Earlier 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 members
					
where 'line' is the line of code where the initialization takes place, and 'idata' is the name of the static data member. Visual C++ no longer generates 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 external
error

void A::test(void)
{
  cout<<idata;
}
void main(void)
{
  A theA;
  theA.test();
}
				

Modification Type:MinorLast Reviewed:7/5/2005
Keywords:kbbug kbCompiler kbCPPonly kbfix KB149784