Доброго времени суток. Есть класс, который включает в себя другой класс со статическими членами массивами. Я очень хочу сделать что бы у меня была возможность задать все статик значения этих членов в хедере а не в cpp части. Для этого я применил constexpr и эта схема нормально заработала на компиляторе от Microsoft. Однако на g++ под ARM на Debian этот код не компилируется:
undefined reference to `Foo::Target::IP'
В обоих случаях используется С++14. Вопрос вот в чём. Почему один компилятор это принимает, а другой нет, т.е. в чём отличия работы с constexpr внутри у этих компиляторов? Это никак не стандартизовано? Что мне сделать, чтобы такая схема заработала?
class Foo {
public:
static void GetIp(uint8_t* data) {
memcpy(data, &Target::IP[0], 4);
};
private:
class Target {
public:
static constexpr uint8_t IP[4] = { 192,168,0,110 };
static constexpr uint16_t Port = 3000;
};
};
int main()
{
uint8_t A[4];
Foo::GetIp(A);
printf("%u.%u.%u.%u", A[0], A[1], A[2], A[3]);
system("PAUSE");
return 0;
}
Ответ
Да чтоб заработало, все просто - добавить
constexpr uint8_t Foo::Target::IP[4];
Только и всего. См. https://ideone.com/ZMqPMn
Но вот что именно строго по стандарту, а что нет - тут я не скажу, не уверен. Понятно, что целочисленное поле и массив - разные вещи, но что именно стандарт разрешает, что нет, и что отдает на откуп реализации - не скажу...
Комментариев нет:
Отправить комментарий