36

クラスで静的文字列を作成しようとしています:(ヘッダーファイルで)

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

私は何を間違えましたか?

4

4 に答える 4

33

できることは、ヘッダーで文字列を宣言し、.cppで初期化することです。

MyClass.hで

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

MyClass.cppで

#include "MyClass.h"
std::string MyClass::foo = "bar"
于 2012-11-07T17:25:33.893 に答える
12

特定のエラー メッセージを無視すると、主な問題は、一般に定義で行う必要があるのに、宣言で静的メンバー属性を初期化しようとしているということです。

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

値が変数の定義で定義されている場合、コンパイラはその値をその単一の翻訳単位でしか使用できませんでした。あなたのコンパイラは2つのテストを行っているようです。1つはconst-ness用で、もう1つは整数部分用であり、したがって2つのエラーメッセージです。

コンパイラでの設計に影響を与える可能性のあるもう 1 つのことは、C++11 標準では、クラスの非静的メンバーの宣言で初期化子が許可されていることです。これは、クラスを提供しない各コンストラクターの初期化子リストで使用されます。そのフィールドの値:

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

メンバーは静的であるため、これは特定の問題とは関係ありませんが、おそらくコンパイラのテストがそのまま分割された理由を説明しています。

于 2012-11-07T17:28:23.647 に答える
4

宣言を定義から分離します。ヘッダー ファイルで、次のようにします。

static string description;

そして、ちょうど 1 つの翻訳単位 (1 つの CPP ファイル) で、次のようにします。

string type::description = "foo";
于 2012-11-07T17:27:46.570 に答える
0

静的メンバーと定数メンバーの間で何が必要なのか正確にはわかりません。静的メンバーはインスタンスではなくクラス自体に関連付けられ、定数メンバーはインスタンスに関連付けられ、定数になります。

ただし、これはこれの重複の可能性があります

よろしく

于 2012-11-07T17:32:53.280 に答える