我想要一個Iterable<T>
類允許在Object上迭代一般。 (T假定是派生的對象)
但是,當定義我的通用Iterable<T>
繼承對象Iterable<Object>
的專用版本時,只要類實例化,我得到一個編譯錯誤在ngng和gcc(但不是MSVC)。 錯誤是Iterable<Object>
是一個不完整的類型。無法繼承clang和gcc中相同類的顯式模板特化
第一個問題是爲什麼,因爲我預計編譯器會在那裏使用Iterable的顯式實例化。 第二個問題是,這將是一個可能的解決方案實現相同的結果,理想的結果是,與未對象應該滿足任意t的Iterable<T>
與Iterable<Object>
#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;
};
這是一種遞歸定義。我的意思是,你正在嘗試專門化一些需要專業化的東西。 – perencia
'Iterable
@perencia但我期望專業化不依賴於一般定義。我理解你的意思是,它實際上是這樣嗎? – N0vember