Compiler Warning (level 2) C4356


The latest version of this topic can be found at Compiler Warning (level 2) C4356.

member' : static data member cannot be initialized via derived class

The initialization of a static data member was ill formed. The compiler accepted the initialization.

This is a breaking change in the Visual C++ .NET 2003 compiler.

For code that works the same in all versions of Visual C++, initialize the member through the base class.

Use the warning pragma to suppress this warning.

The following sample generates C4356:

// C4356.cpp  
// compile with: /W2 /EHsc  
#include <iostream>  
template <class T>  
class C {  
   static int n;  
class D : C<int> {};  
int D::n = 0; // C4356  
// try the following line instead  
// int C<int>::n = 0;  
class A {  
   static int n;  
class B : public A {};  
int B::n = 10;   // C4356  
// try the following line instead  
// int A::n = 99;  
int main() {  
   using namespace std;  
   cout << B::n << endl;