鉴于以下定义:
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()
{}
答案 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.。
在我看来,你的问题的答案是:你不能这样做,但这是一种耻辱。