답변:
하나의 컴파일 단위 (보통 .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
. 자세한 내용은 아래 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)이어야합니다. 이 경우 멤버는 정수 상수 표현식으로 나타날 수 있습니다. 멤버가 프로그램에서 사용되는 경우 네임 스페이스 범위에서 멤버를 정의해야하며 네임 스페이스 범위 정의에 이니셜 라이저가 포함되어서는 안됩니다.