首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有类内初始值设定项的C++成员必须为常量

具有类内初始值设定项的C++成员必须为常量
EN

Stack Overflow用户
提问于 2012-11-08 01:22:33
回答 4查看 29K关注 0票数 36

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

代码语言:javascript
复制
static string description = "foo";

但是我得到了这个错误:

代码语言:javascript
复制
IntelliSense: a member with an in-class initializer must be const

如果我把它改成这样:

代码语言:javascript
复制
static const string description = "foo";

我得到了这个错误:

代码语言:javascript
复制
IntelliSense: a member of type "const std::string" cannot have an in-class initializer

我做错什么了?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-08 01:25:34

您可以做的是在头部中声明字符串,并在.cpp中对其进行初始化。

在MyClass.h中

代码语言:javascript
复制
#include <string>
class MyClass
{
  static std::string foo;
}

在MyClass.cpp中

代码语言:javascript
复制
#include "MyClass.h"
std::string MyClass::foo = "bar"
票数 33
EN

Stack Overflow用户

发布于 2012-11-08 01:28:24

忽略具体的错误消息,核心问题是您试图在声明中初始化静态成员属性,而通常应该在定义中完成此操作。

代码语言:javascript
复制
// header
struct test {
  static std::string x;
};
// single cpp
std::string test::x = "foo";

现在回到错误消息。C++03标准中有一个例外,它允许为常量整数类型的声明提供初始值设定项,以便该值在包括标头的所有转换单元中都可见,从而可以用作常量表达式:

代码语言:javascript
复制
// header
struct test {
   static const int size = 10;
};
// some translation unit can do
struct A {
   int array[test::size];
};

如果该值是在变量的定义中定义的,则编译器只能在该单个翻译单元中使用它。看起来你的编译器正在做两个测试,一个是常量测试,另一个是整体测试,因此有两个错误消息。

另一件可能影响编译器中的设计的事情是,C++11标准允许在类的非静态成员的声明中使用初始化器,然后这些初始化器将在每个没有为该字段提供值的构造函数的初始化器列表中使用:

代码语言:javascript
复制
struct test {
   int a = 10;
   int b = 5;
   test() : a(5) // b(5) implicitly generated
   {} 
};

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

票数 12
EN

Stack Overflow用户

发布于 2012-11-08 01:27:47

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

代码语言:javascript
复制
static string description;

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

代码语言:javascript
复制
string type::description = "foo";
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13274876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档