c++ - 无法继承 clang 和 gcc 中同一类的显式模板特化

标签 c++ templates inheritance

我想要一个 Iterable<T>类也允许在 Object 上进行一般迭代。 (假定 T 是 Object 的派生对象)
但是,在定义我的通用 Iterable<T> 时作为继承对象的专用版本 Iterable<Object> ,一旦类被实例化,我就会在 clang 和 gcc 中得到一个编译错误(但在 MSVC 中没有)。 错误是 Iterable<Object>是一个不完整的类型。

第一个问题是为什么,因为我预计编译器会在那里使用 Iterable 的显式实例化。 第二个问题是实现相同结果的可能解决方案是什么,期望的结果是 Iterable<T>任何不是 Object 的 T 都应该满足与 Iterable<Object> 的 IS A 关系

#include <functional>

class Object
{};

class Foo : public Object
{};

template <class T>
class Iterable : public Iterable<Object>
{
public:
    virtual void iterate(const std::function<void(T&)>& callback) const = 0;
};

template <>
class Iterable<Object>
{
public:
    virtual void iterate(const std::function<void(Object&)>& callback) const = 0;
};

最佳答案

您可以通过先声明主模板,然后特化它,然后定义它来轻松解决这个问题:

template <class T>
class Iterable;

template <>
class Iterable<Object>
{
public:
    virtual void iterate(const std::function<void(Object&)>& callback) const = 0;
};

template <class T>
class Iterable : public Iterable<Object>
{
public:
    virtual void iterate(const std::function<void(T&)>& callback) const = 0;
};

[Live example]

但是,请注意实例产生的警告:Iterable<T>::iterate不会覆盖 Iterable<Object>::iterate ,因为它们的参数有不同的类型。您必须在所有派生自 Iterable<T> 的类中实现这两个类对于 T除了Object .

关于c++ - 无法继承 clang 和 gcc 中同一类的显式模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42769807/

相关文章:

c++ - 如何使用 V8 的内置函数

go - 有没有一种方法可以计算Go模板?

c++ - 如何为类模板生成别名?

C++11 可变参数函数类型模板参数

c++ - 抽象类继承和智能指针容器

python - Django:覆盖继承的字段选项

c++ - 静态成员函数是可重入的吗?

c++ - 将 float 与特定 NAN 值进行比较的最正确方法是什么?

c++ - 如何在不下载 cURL 二进制获取请求中的文件的情况下获取文件的长度

c# - 方法属性在 C# 中是继承的吗?