template <class T1, class T2>
class A {
template <typename T>
struct BarSelector {
void bar(T*) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};
template <> struct BarSelector<D> {
void bar(D*) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};
public:
void foo(T2* pT2) {
// do something
BarSelector<T2> selector;
selector.bar(pT2);
}
};
int main() {
C c;
A<B, C> a1;
a1.foo(&c);
D* pD;
A<B, D> a2;
a2.foo(pD);
}
编译器给出:
toverloading.cpp:20:11: error: explicit specialization in non-namespace scope ‘class A<T1, T2>’
template <> struct BarSelector<D> {
^
toverloading.cpp:20:20: error: template parameters not used in partial specialization:
template <> struct BarSelector<D> {
^
toverloading.cpp:20:20: error: ‘T1’
toverloading.cpp:20:20: error: ‘T2’
如果我将BarSelector移到A类之外,它将起作用。
将它们保留在A类中的正确语法是什么?
谢谢!
最佳答案
不,显式专门化不能放在类范围内,而必须放在命名空间范围内。
根据标准,$ 14.7.3 / 2显式专门化[temp.expl.spec]
因此,您必须将其移至类之外,例如:
template<>
template<>
class A<B, D>::BarSelector<D> {
void bar(double*) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};
请注意,如果不显式地专门化包含类,就不可能对成员进行专门化。这可能是关于为什么不能在类范围内显式专门化成员模板的旁注(这使您可以专门化成员模板而不显式专门化外部类模板)。
关于c++ - 在模板化类中专门化模板化结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35318293/