如何在另一个类中专门化模板类的构造函数?

时间:2019-06-01 13:26:57

标签: c++ class c++11 templates template-specialization

请考虑以下课程:

// Class1.hpp
class Class1 {};

// Class2.hpp
class Class2 {};

// ClassA.hpp
#include "Class1.hpp"
#include "Class2.hpp"

class A {
private:
    enum class Enum {
        Enum1,
        Enum2
    };

    struct B {
        B(Enum argEum) : enumMember{argEnum} {}
        Enum enumMember;
    };

    template <class T>
    struct C : public B {}
};

现在,我想对C的构造函数进行以下专门化:

C<Class1>::C() : B{Enum::Enum1} {}
C<Class2>::C() : B{Enum::Enum2} {}

根据我的尝试,我想我必须将专业化置于类A的类定义之外,但是我真的不知道该怎么做。

1 个答案:

答案 0 :(得分:2)

您可以在出现模板化实体的声明的任何地方放置专门化名称。命名空间范围很好,但是它要求您完全限定您要研究的专业知识。

此外,您可能不会专门化未在主模板中首先声明的成员。因此,请牢记这两点:

// In the class
template <class T>
struct C : public B {
    C() = delete;
};

// In namespace scope

template<>
A::C<Class1>::C() : B{Enum::Enum1} {}

template<>
A::C<Class2>::C() : B{Enum::Enum2} {}

还有一个live example要引用。