给定以下定义:
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()
{}
给定以下定义:
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()
{}
也就是说:以下任何内容的显式特化:
— ...
— 类模板的成员函数
— ...
都可以通过由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>> ...
};
你不能部分特化成员函数(实际上也不能部分特化任何函数)。你需要部分特化整个类:
template<typename T>
class A<B<T>>
{
// implement member functions for this specialization here
};
如果你必须要有:
template <typename T>
void A<B<typename T>>::f() {}
那么你唯一的选择就是部分特化 A
。
template <typename T> class A<B<T>>
{
public:
void f();
};
C++11引入了别名模板(Alias Templates),使得您可以做一些像这样的事情:
template<T>
using AB = A<B<T>>;
那么你可以使用AB<T>
代替A<B<T>>
。
不幸的是,你不能用它进行特化。。
所以在我看来,对于你的问题的答案是:你不能这样做,但这很遗憾。
template<typename T> void A<B<T>>::f() {}
。 - dyp