我相信這是一個奇怪的循環模板模式的例子。在我看來,這應該編譯,但事實並非如此。這是在Xcode 8.3中的Clang。爲什麼這個好奇的循環模板模式示例不能編譯?
template<class T>
class Fungeable
{
public:
virtual ~Fungeable() {}
virtual bool funge(const Fungeable<T>& inFungeable) const = 0;
};
class Blarg : public Fungeable<Blarg>
{
public:
virtual bool funge(const Blarg& inFungeable) const override { return true; }
};
int main(int argc, const char * argv[]) {
Blarg b;
Blarg x;
return static_cast<int>(b.funge(x));
}
看起來這應該工作,因爲Blarg 是一個 Fungeable。但我得到的錯誤'funge' marked 'override' but does not override any member functions
如果我改變的Blarg::funge()
簽名採取Fungeable<Blarg>
這樣的:
class Blarg : public Fungeable<Blarg>
{
public:
virtual bool funge(const Fungeable<Blarg>& inFungeable) const override { return true; }
};
然後再編譯。
由於Blarg
的定義和定義Fungeable<Blarg>
不應該是第一個版本?
「因爲Blarg的定義是Fungeable」每個Blarg'都是一個Fungeable '但不是每個Fungeable 都是一個Blarg。 –
tkausl