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){
}
编辑:Sean F. 在评论中指出编译器很难选择专业化。但这里的问题是,部分专业化并不能解决这个问题。所以这不可能是答案。