簡體   English   中英

std::is_base_of 用於 ctor 編譯錯誤

[英]std::is_base_of for a ctor compiling error

已編輯

我有以下內容:

#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

謝謝。

您可以按如下方式更改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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM