回答:
1つのコンパイルユニット(通常は.cppファイル)のどこでも実行できます。
foo.h
class foo {
static const string s; // Can never be initialized here.
static const char* cs; // Same with C strings.
static const int i = 3; // Integral types can be initialized here (*)...
static const int j; // ... OR in cpp.
};
foo.cpp
#include "foo.h"
const string foo::s = "foo string";
const char* foo::cs = "foo C string";
// No definition for i. (*)
const int foo::j = 4;
(*)整数定数式以外のコードで使用する場合は、標準に従ってi
、クラス定義の外(j
isなど)で定義する必要があります。詳細については、以下のDavidのコメントを参照してください。
i
定義する必要があるようですよね?この場合、確認するのに十分なコンテキストがないため、エラーがあるとは言えません。または、厳密に言うと、他のコードがない場合は上記の例が正しいです。今、私はあなたのコメントに感謝します(+1)、私はまだ自分で物事を学んでいます!だから私は答えでその点を明確にしようと思います、それが良いかどうか知らせてください...
int f() { return 42; } class foo { static const int i = f(); /* Error! */ }
注C ++ 11の「constexprの」関数を呼び出すことができますこと:constexpr int f() { return 42; } class foo { static const int i = f(); /* Ok */ }
同じ名前空間内の翻訳単位で、通常は上部にあります。
// foo.h
struct foo
{
static const std::string s;
};
// foo.cpp
const std::string foo::s = "thingadongdong"; // this is where it lives
// bar.h
namespace baz
{
struct bar
{
static const float f;
};
}
// bar.cpp
namespace baz
{
const float bar::f = 3.1415926535;
}
i
必要があります。§9.4.2/ 4 静的データメンバーがconst整数型またはconst列挙型である場合、クラス定義での宣言により、定数定数式(5.19)となる定数初期化子を指定できます。その場合、メンバーは整数定数式で表すことができます。メンバーは、プログラムで使用され、ネームスペーススコープ定義に初期化子が含まれていない場合、ネームスペーススコープで定義されます。