在 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() {}