Ответ 1
// in foo.h
class Foo {
static const unsigned char* Msg;
};
// in foo.cpp
static const unsigned char Foo_Msg_data[] = {0x00,0x01};
const unsigned char* Foo::Msg = Foo_Msg_data;
Довольно понятно. Массив имеет интегральный тип, содержимое известно и неизменено, а С++ 0x недопустимо. Он также должен быть объявлен как указатель. Я просто не могу найти синтаксис, который работает.
Объявление в Class.hpp:
static const unsigned char* Msg;
В классе Class.cpp действительно есть то, с чем я работал:
const unsigned char Class::Msg[2] = {0x00, 0x01}; // (type mismatch)
const unsigned char* Class::Msg = new unsigned char[]{0x00, 0x01}; // (no C++0x)
... и т.д.. Я также попытался инициализировать внутри конструктора, что, конечно, не работает, потому что это константа. Неужели я прошу о невозможности?
// in foo.h
class Foo {
static const unsigned char* Msg;
};
// in foo.cpp
static const unsigned char Foo_Msg_data[] = {0x00,0x01};
const unsigned char* Foo::Msg = Foo_Msg_data;
Вы смешиваете указатели и массивы. Если вам нужен массив, используйте массив:
struct test {
static int data[10]; // array, not pointer!
};
int test::data[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Если, с другой стороны, вам нужен указатель, самым простым решением является написать вспомогательную функцию в блоке перевода, которая определяет член:
struct test {
static int *data;
};
// cpp
static int* generate_data() { // static here is "internal linkage"
int * p = new int[10];
for ( int i = 0; i < 10; ++i ) p[i] = 10*i;
return p;
}
int *test::data = generate_data();