部分模板成员专业化

时间:2015-05-08 18:48:30

标签: c++ templates partial-specialization

鉴于以下定义:

template <typename T>
class A {

public:

   void f();

};

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

template <typename T>
class B {};

我如何对某些A<B<T>>::f部分专门化f,即B<T>?我基本上是在寻找正确的魔法来替换下面的???

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

4 个答案:

答案 0 :(得分: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>> ...
};

答案 1 :(得分:1)

您不能部分专门化成员函数(实际上也不是任何函数)。你需要部分专门化整个班级:

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

答案 2 :(得分:0)

如果你必须:

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

那么你唯一的选择是部分专注A

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

答案 3 :(得分:-2)

C ++ 11有Alias Templates,允许你做类似的事情:

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

然后,您可以参考AB<T>而不是A<B<T>>

不幸的是,you can't use that for specialization.

在我看来,你的问题的答案是:你不能这样做,但这是一种耻辱。