什么是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
命名空间,使得它看起来就像模板充当虽然,就好像是位于同一地点的代码作为初始化行为模板定义本身。
该规范的规定是什么规定了这种行为? (请注意,这是对GCC 4.8.1测试,看起来迄今有点像一个bug ......)
呵呵?你的意思是拼出来像g :: F :: n_s?我可以清楚地看到,它必须像使用命名空间g一样被限定,不管它在哪里使用,但我不明白为什么在h中允许初始化,或者为什么要在f中使用F :: n_s {h :: X :: k}初始化允许在g之外,而不需要额外的g :: qualifier ... –
Jeff