C++具有类内初始化器的成员必须是const

ecr0jaav  于 2023-11-19  发布在  其他
关注(0)|答案(5)|浏览(86)

我试图在我的类中创建一个静态字符串:(在我的头文件中)

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


我做错了什么?

ds97pgxw

ds97pgxw1#

你可以做的是在头文件中声明字符串,并在. cpp中初始化它。
在MyClass. h中

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

字符串
在MyClass.cpp中

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

tag5nh1u

tag5nh1u2#

忽略特定的错误消息,核心问题是您试图在 declaration 中初始化静态成员属性,而通常应该在 definition 中完成。

// 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
   {} 
};


这与您的特定问题无关,因为您的成员是静态的,但它可能解释了为什么编译器中的测试被拆分。

rn0zuynd

rn0zuynd3#

将声明与定义分开。在头文件中,执行以下操作:

static string description;

字符串
然后在一个翻译单元(一个CPP文件)中,执行以下操作:

string type::description = "foo";

7vhp5slm

7vhp5slm4#

我不知道你在静态成员和常量成员之间到底需要什么。静态成员将与类本身相关联,而不是与示例相关联,而常量成员则与示例相关联,并且是常量。
但是,这可能是this的副本
问候

xa9qqrwz

xa9qqrwz5#

我相信从C++11你可以使用constexpr

class {
//...more code here
public: static constexpr float X = 1.2f;
}

字符串

相关问题