部分模板成员特化

3

给定以下定义:

template <typename T>
class A {

public:

   void f();

};

template <typename T>
void
A<T>::f()
{}

template <typename T>
class B {};

我如何部分特化 A<B<T>>::f,即为某些 B<T> 特化 f?我基本上正在寻找下面的???的正确方法

template <???>
void
A<B<T>>::f()
{}
4个回答

3
您可以通过 [temp.expl.spec] 进行显式模板特化:

以下任何内容的显式特化:
— ...
— 类模板的成员函数
— ...
都可以通过由 template<> 引入的声明来声明。

也就是说:
template <>
void A<B<int>>::f() {
    std::cout << "B\n";
}

但是你无法对类模板的成员函数进行部分特化。你必须对整个类进行部分特化:

template <typename T>
class A<B<T>> {
public:
    void f() {
        std::cout << "B\n";
    }

    // ... all other members you want in A<B<T>> ...
};

你知道标准文献中明确规定了这一点吗?即不允许对类模板的成员函数进行部分特化。 - regnirpsj
@regnirpsj,“类模板部分特化的成员的模板参数列表应该与类模板部分特化的模板参数列表匹配。类模板部分特化的成员的模板参数列表应该与类模板部分特化的模板参数列表匹配。”这句话已经暗示了这一点。 - Barry
谢谢。我从来不喜欢标准中的律师用语,但经过一些解析后它变得有意义了。 - regnirpsj
@regnirpsj,你也可以查看 **14.8 函数模板特化 [temp.fct.spec]**。 - vsoftco

1

你不能部分特化成员函数(实际上也不能部分特化任何函数)。你需要部分特化整个类:

template<typename T>
class A<B<T>>
{
    // implement member functions for this specialization here
};

0

如果你必须要有:

template <typename T>
void A<B<typename T>>::f() {}

那么你唯一的选择就是部分特化 A

template <typename T> class A<B<T>>
{
   public:
      void f();
};

-2

C++11引入了别名模板(Alias Templates),使得您可以做一些像这样的事情:

template<T>
using AB = A<B<T>>;

那么你可以使用AB<T>代替A<B<T>>

不幸的是,你不能用它进行特化。

所以在我看来,对于你的问题的答案是:你不能这样做,但这很遗憾。


别名模板与OP的问题有什么关系? - dyp
它们是解决方案的前半部分。 - zmbq
2
我不知道它们如何成为解决方案的前半部分,因为您可能无法部分地专门化成员函数。如果允许,它可能只是template<typename T> void A<B<T>>::f() {} - dyp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接