Подтвердить что ты не робот

С++ член с инициализатором в классе должен быть const

Я пытаюсь создать статическую строку в моем классе: (в моем файле заголовка)

static string description = "foo";

но я получаю эту ошибку:

IntelliSense: a member with an in-class initializer must be const

если я изменю его на это:

static const string description = "foo";

Я получаю эту ошибку вместо:

IntelliSense: a member of type "const std::string" cannot have an in-class initializer

Что я сделал не так?

4b9b3361

Ответ 1

Что вы можете сделать, это объявить строку в заголовке и инициализировать ее в вашем .cpp.

в MyClass.h

#include <string>
class MyClass
{
  static std::string foo;
}

в MyClass.cpp

#include "MyClass.h"
std::string MyClass::foo = "bar"

Ответ 2

Игнорируя конкретное сообщение об ошибке, основная проблема заключается в том, что вы пытаетесь инициализировать атрибут статического члена в объявлении, в то время как в общем случае это должно быть сделано в определении.

// header
struct test {
  static std::string x;
};
// single cpp
std::string test::x = "foo";

Теперь вернитесь к сообщениям об ошибках. В стандарте С++ 03 есть исключение, которое позволяет предоставить инициализатору объявление константного интегрального типа, так что это значение может быть видимым во всех единицах трансляции, которые включают заголовок, и поэтому могут использоваться как константное выражение

// header
struct test {
   static const int size = 10;
};
// some translation unit can do
struct A {
   int array[test::size];
};

Если значение было определено в определении переменной, то компилятор мог использовать его только в этой единице перевода. Кажется, что ваш компилятор выполняет два теста: один для константы и отдельный для неотъемлемой части и, следовательно, два сообщения об ошибках.

Еще одна вещь, которая может повлиять на этот проект в компиляторе, заключается в том, что стандарт С++ 11 допускает инициализаторы в объявлении нестатических членов класса, которые затем будут использоваться в списке инициализаторов каждого конструктора, который делает не укажите значение для этого поля:

struct test {
   int a = 10;
   int b = 5;
   test() : a(5) // b(5) implicitly generated
   {} 
};

Это не связано с вашей конкретной проблемой, так как ваш член статичен, но, вероятно, объясняет, почему тесты в компиляторе были разделены, как есть.

Ответ 3

Отделите декларацию от определения. В файле заголовка сделайте следующее:

static string description;

И затем точно в одну единицу перевода (один файл CPP) сделайте следующее:

string type::description = "foo";

Ответ 4

Я не знаю, что именно нужно между статическим членом и постоянным членом. Статический член будет связан с самим классом, а не с экземплярами, а постоянный член связан с экземпляром и будет постоянным.

Однако это возможный дубликат this

Привет