Visual Studio 2010 — C ++ член с инициализатором в классе должен быть постоянным

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

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

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

14

Решение

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

в MyClass.h

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

в MyClass.cpp

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

Другие решения

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

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

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

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

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

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

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

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

5

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

static string description;

А затем ровно в одной единице перевода (одном файле CPP) сделайте это:

string type::description = "foo";
2

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

Тем не менее, это возможный дубликат этот

С уважением

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector