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/

10-11 21:46