【发布时间】:2014-01-29 06:03:10
【问题描述】:
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 上测试的,到目前为止看起来有点像一个错误......)
【问题讨论】:
标签: c++ template-specialization static-initialization fully-qualified-naming