我想要一个 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;
};
但是,请注意实例产生的警告:Iterable<T>::iterate
不会覆盖 Iterable<Object>::iterate
,因为它们的参数有不同的类型。您必须在所有派生自 Iterable<T>
的类中实现这两个类对于 T
除了Object
.
关于c++ - 无法继承 clang 和 gcc 中同一类的显式模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42769807/