Как специализировать конструктор шаблонного класса в другом классе? - PullRequest
2 голосов
/ 01 июня 2019

Рассмотрим следующие классы:

// 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} {}

Судя по тому, что я пытался, я должен поместить специализации вне определения класса класса А, но я не знаю, как это сделать.

1 Ответ

4 голосов
/ 01 июня 2019

Вы можете разместить специализацию везде, где может появиться объявление шаблонной сущности.Область имен в порядке, но она требует от вас полной квалификации того, что вы специализируете.

Кроме того, вы не можете специализировать элемент, который не был объявлен в основном шаблоне первым.Итак, помня об этих двух моментах:

// 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} {}

И живой пример для ссылки.

...