请考虑以下课程:
// 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的类定义之外,但是我真的不知道该怎么做。
答案 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要引用。