템플릿 전문화 및 네임 스페이스 자격과 관련하여 C++의 규칙은 무엇입니까? 다음 코드와 동등한 코드를 가지고 있었고 템플릿 전문화 초기화에 관한 C++의 규칙을 이해하지 못한다는 것을 깨달았습니다. 처음에는 g::F<>
의 전문화가 심지어 h
안에 허용된다는 것이 나에게 이상하게 보입니다. 그러나 주어진 사실을 나는 왜 그런 식으로 행동하는지 모르겠다.템플릿 전문화/초기화 및 네임 스페이스?
namespace g {
struct N {
N(char c):c_(c){}
char c_;
};
template <typename V>
struct F {
static N n_s; // <-- want to initialize these for specializations
};
namespace h {
struct X { static constexpr char k{'x'}; };
template <> N F<char>::n_s{h::X::k}; // OK
template <> N F<int>::n_s{X::k}; // fails on "‘X’ not declared"
}
} // namespace g
// Seems weirdest to me. N and F need full qualifications but X doesn't.
template <> g::N g::F<float>::n_s{h::X::k}; // OK also!
템플릿 정적 멤버 이니셜 라이저는 g
공간을 유추 마지막 인스턴스화/초기화, 그것은 템플릿 행위 것처럼 보일 수 있습니다 그것은이 같은 코드에 같은 장소에있는 것처럼 이니셜 역할 마치 템플릿 정의 자체.
이 동작을 규정하는 사양의 규칙은 무엇입니까? 에서
huh? g :: F :: n_s와 같은 철자를 의미합니까? 나는 그것이 네임 스페이스 g에서 사용 된 것처럼 어디에서나 정규화 된 것을 볼 수 있지만 F :: n_s 초기화가 h에서 허용되는 이유나 왜 F :: n_s {h :: X :: k} 초기화가 추가 g :: 한정자없이 g 외부에서 허용됩니다. –
Jeff