std :: is_base_of для ошибки компиляции ctor - PullRequest
0 голосов
/ 14 июля 2020

Отредактировано

У меня есть следующее:

#include <iostream>
#include <vector>
#include <type_traits>

class IListableItem {};
class SubIListableItem : public IListableItem {};
class Base{};
template<class T> struct is_listable_item : public std::false_type {};
template<class T> struct is_listable_item<std::is_base_of<IListableItem, T>> : public std::true_type {};
template<class T, std::enable_if_t<is_listable_item<T>::value, bool> = true>
class ImplementationOfBase : public Base
{
public:
    explicit ImplementationOfBase(const std::vector<T> &items): Base(){}
    virtual ~ImplementationOfBase(){}

protected:
    std::vector<std::wstring> getLabels(const std::vector<T> &source)
    {
    std::vector<std::wstring> ret;
    for (auto &i : source) ret.emplace_back(i.label);
    return ret;
    }
};

class Page : public ImplementationOfBase<SubIListableItem> {};

int main ()
{

}

Он возвращает мне:

prog.cc:34:58: error: no type named 'type' in 'struct std::enable_if<false, bool>'
   34 | class Page : public ImplementationOfBase<SubIListableItem> {};
      |                                                          ^

Я не могу используйте указатели в этом случае Любые подсказки?

Живой пример: https://wandbox.org/permlink/ESviQ0qHrjLPX9wE

Спасибо.

1 Ответ

0 голосов
/ 14 июля 2020

Вы можете изменить определение is_listable_item следующим образом:

template<class T> struct is_listable_item : public std::is_base_of<IListableItem, T> {};

Ваш код не работает, потому что is_listable_item был специализирован для std::is_base_of<IListableItem, T>, но вы передаете SubIListableItem.

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