Что у вас есть?
У вас есть определение class
с именем A
.
Ваш класс имеет a unsigned long
с именем a
.
Ваш класс имеет a static const unsigned long
с именем b
.
В некоторых компиляторах C ++ static и нестатические члены class
нельзя смешивать, особенно на этапе определения.
Что вы хотите?
static const unsigned long b = sizeof(unsigned long);
Это не совсем то, что вы хотите, но именно так умный компилятор пытается выяснить.
ПОЧЕМУ ???
Потому что статические члены не ограничивают свою область определением объекта.Они выходят за рамки объекта и доступны из любого места, просто выводя A::b
в консоль, используя, например, std::cout << A::b << std::endl
.
Clang не принимает эту конструкцию, GCC принимает (оба с -g -std=c++98
)
MSVC 19.14 (Visual Studio 15.7) тоже не принимает его, но Visual Studio 15.8 с MSVC 19.15 делает.
Тщательно выбирайте.
Где я проверяювсе это?
Здесь я проверяю множество компиляторов: https://godbolt.org/ Это один из методов, но в будущем вы должны избегать такого рода хаков.
Магический код для проверкии вина
Часть обвинения предназначена для смешивания C и C ++.Это только для компиляции со старыми версиями без каких-либо проверок:
#include <stdio.h>
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;
}