在 sfinae 中使用模板 class 时纯虚方法的定义
Definition of pure virtual method while using templated class with sfinae
我正在尝试学习和使用 sfinae,这是我第一次尝试这样做。我有以下代码:
template<class CoreType, typename std::enable_if_t<std::is_base_of_v<Core, CoreType>>* = nullptr>
class Window
{
protected:
std::shared_ptr<Engine<CoreType>> _engine;
public:
virtual ~Window() = 0;
};
template<class CoreType, typename std::enable_if_t<std::is_base_of_v<Core, CoreType>>* = nullptr>
Window<CoreType>::~Window() {} // <- problem is here
我收到此错误:E0498 模板参数列表必须与参数列表匹配
这似乎我应该以某种方式提供 sfinae 的虚拟参数,但如何?
如果我删除导致问题的 , typename std::enable_if_t<std::is_base_of_v<Core, CoreType>>* = nullptr
,它会正常工作,但我想学习如何使用 sfinae,我只能在 google 上找到这个特殊案例。有人可以帮我吗?谢谢
您是在告诉编译器 ~Window ()
函数是 Window<CoreType>
class 的一部分。然而,没有这样的class。您定义的 class 采用两个模板参数(一个用于 SFINAE 的事实无关紧要)。
您也在使用 typename std::enable_if_t<...>
,但 _t
后缀表示 typename
已经为您完成。所以实际上你在那里有 typename typename std::enable_if<...>
。
另请注意,您不应重复默认模板参数,就像您不应为函数定义重复默认函数参数一样。
最后,您必须为所有参数命名以便能够引用它们。所以未命名的std::enable_if_t
需要一个名字。
所有这些加在一起就变成了:
template <class CoreType,
std::enable_if_t<std::is_base_of_v<Core, CoreType>> * Enable>
Window<CoreType, Enable>::~Window() {}
我正在尝试学习和使用 sfinae,这是我第一次尝试这样做。我有以下代码:
template<class CoreType, typename std::enable_if_t<std::is_base_of_v<Core, CoreType>>* = nullptr>
class Window
{
protected:
std::shared_ptr<Engine<CoreType>> _engine;
public:
virtual ~Window() = 0;
};
template<class CoreType, typename std::enable_if_t<std::is_base_of_v<Core, CoreType>>* = nullptr>
Window<CoreType>::~Window() {} // <- problem is here
我收到此错误:E0498 模板参数列表必须与参数列表匹配
这似乎我应该以某种方式提供 sfinae 的虚拟参数,但如何?
如果我删除导致问题的 , typename std::enable_if_t<std::is_base_of_v<Core, CoreType>>* = nullptr
,它会正常工作,但我想学习如何使用 sfinae,我只能在 google 上找到这个特殊案例。有人可以帮我吗?谢谢
您是在告诉编译器 ~Window ()
函数是 Window<CoreType>
class 的一部分。然而,没有这样的class。您定义的 class 采用两个模板参数(一个用于 SFINAE 的事实无关紧要)。
您也在使用 typename std::enable_if_t<...>
,但 _t
后缀表示 typename
已经为您完成。所以实际上你在那里有 typename typename std::enable_if<...>
。
另请注意,您不应重复默认模板参数,就像您不应为函数定义重复默认函数参数一样。
最后,您必须为所有参数命名以便能够引用它们。所以未命名的std::enable_if_t
需要一个名字。
所有这些加在一起就变成了:
template <class CoreType,
std::enable_if_t<std::is_base_of_v<Core, CoreType>> * Enable>
Window<CoreType, Enable>::~Window() {}