I have such code:
class A
{
public:
unsigned long a;
static const unsigned long b = sizeof(a); // \"error C2327: \'A::a\' : is not a type name, static,
You have the definition of a class
named A
.
Your class has a unsigned long
named a
.
Your class has a static const unsigned long
named b
.
In certain C++ compilers, static and non-static members of a class
can't be mixed, specially in the definition stage.
static const unsigned long b = sizeof(unsigned long);
This is not exactly what you want, but this is how a smart compiler try to figure out.
Because static members doesn't limit their scope to the object definition. They overpass the object scope and can be accessed from everywhere simply outputting A::b
in the console using std::cout << A::b << std::endl
, for example.
Clang doesn't accept this construction, GCC does (both with -g -std=c++98
)
MSVC 19.14 (visual studio 15.7) doesn't accept it, too, but visual studio 15.8, with MSVC 19.15, does.
Choose carefully.
Here I check lots of compilers: https://godbolt.org/ This is one method, but you must evade this kind of hacks in the future.
The blame part is for mixing C and C++. It's only for compile with older versions without any checks:
#include
class A
{
public:
unsigned long a;
static const unsigned long b = sizeof(a); // "error C2327: 'A::a' : is not a type name, static, or enumerator" in VC++
};
int main (void)
{
printf ( "Hello World" ); // I strongly not recommend using printf's in C++ code.
printf ( "%d", A::b ); // This is only to fill a functional example, not a rightful one.
return 0;
}