Я пытаюсь создать статическую строку в моем классе: (в моем заголовочном файле)
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
Что я сделал не так?
Что вы можете сделать, это объявить строку в заголовке и инициализировать ее в вашем .cpp.
в MyClass.h
#include <string>
class MyClass
{
static std::string foo;
}
в MyClass.cpp
#include "MyClass.h"std::string MyClass::foo = "bar"
Игнорируя конкретное сообщение об ошибке, основная проблема заключается в том, что вы пытаетесь инициализировать атрибут статического члена в декларация в то время как в целом это должно быть сделано в определение.
// 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
{}
};
Это не связано с вашей конкретной проблемой, поскольку ваш член статичен, но, вероятно, объясняет, почему тесты в компиляторе были разделены так, как они есть.
Отделите декларацию от определения. В заголовочном файле сделайте это:
static string description;
А затем ровно в одной единице перевода (одном файле CPP) сделайте это:
string type::description = "foo";
Я не знаю, что именно вам нужно между статическим членом и постоянным членом. Статический член будет связан с самим классом, а не с экземплярами, а постоянный член связан с экземпляром и будет постоянным.
Тем не менее, это возможный дубликат этот
С уважением