как получить частичную работу шаблона с подклассом - PullRequest
2 голосов
/ 23 мая 2019

Я пытаюсь сделать шаблон универсальным со структурой и подструктурой, но мой код не может вывести правильный шаблон.это абстракция моего кода

#include <iostream>
using namespace std;
struct A{

};
struct B{

};
struct AA:public A{

};
struct BB:public B{

};

template<class container>
class Base{

};
template<class container>
class Derived:Base<container>{
    Derived() = delete;
};
template<>
class Derived<A>:Base<A>{

};
template<>
class Derived<B>:Base<B>{

};
int main() {
    Derived<AA> a;
    return 0;
}

и получил ошибку

error: call to deleted constructor of 'Derived<AA>'

Я хочу struct A и его подкласс можно использовать с

template<>
class Derived<A>:Base<A>{

};

какя могу сделать это, или какой материал я должен ссылаться?Спасибо за помощь!

1 Ответ

3 голосов
/ 23 мая 2019

Вы можете использовать частичную специализацию, например

// primary template
template<class container, class = void>
class Derived : Base<container> {
    Derived() = delete;
};

// partial specialization for A and its derived classes
template<class container>
class Derived<container, std::enable_if_t<std::is_base_of_v<A, container>>> : Base<container> {
};

, а также полную специализацию, если необходимо.

// full specialization for B
template<>
class Derived<B, void> : Base<B> {
};

LIVE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...