【发布时间】:2018-11-16 18:56:34
【问题描述】:
IMO,C++ 模板规则似乎过于严格,并且定义了编译器实现。但是在这里我有一个特定的行为,我很难理解。
在下面的问题中,我有意识地尽量避免显式地特化父类。
问题是,我可以部分专门化一个成员,但不能完全专门化它。这确实违反直觉,因为您可以轻松地将虚拟模板添加到完全专业化的模板并使其部分专业化。这是怎么回事??
重要编辑:这很重要,因为我们知道,如果不专门化类,就不能专门化成员函数(这可以看作是这个问题的组合,需要部分专门化,以及 c++不允许部分专门化的函数。我不知道这些是否相关,但至少它们是一致的),因此,如果你想在你的类中使用一个你可以专门化的函数,你就会被使用函子困住。最重要的是,您需要添加一个虚拟模板参数才能使其正常工作!!
这行得通:
template <class T>
class A
{
template<typename Y, typename Z>
struct C{
void operator()(int x);
};
template<typename Z>
struct C<int, Z>{
void operator()(int x);
};
};
template <class T>
template <typename Z>
void A<T>::C<int, Z>::operator()(int x){
}
但这不是:
template <class T>
class A
{
template<typename Y>
struct C{
void operator()(int x);
};
template<>
struct C<int>{
void operator()(int x);
};
};
template <class T>
template <>
void A<T>::C<int>::operator()(int x){
}
编辑:cmets 中的 Sean F. 指出编译器很难选择专业化。但这里的问题是,部分专业化并不能解决这个问题。所以这不可能是答案。
【问题讨论】:
-
你已经正确地陈述了规则(C++17 temp.expl.spec/16 "[...] 如果它的封闭类模板不是,则声明不应显式特化类成员模板也明确专门化”)。我不知道原因,希望有人知道!
-
谢谢,我通过实验得出了结论。因此,知道这是事实可以减轻一定程度的不确定性。
标签: c++ templates template-specialization partial-specialization rationale