什麼是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