これは、不思議な繰り返しテンプレートパターンの例だと思います。これはコンパイルするべきだと私は思うが、そうはしない。これは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あるので、これは動作するはずのように思えます。私はこのようなFungeable<Blarg>
取るためにBlarg::funge()
の署名を変更した場合しかし、私はエラーに'funge' marked 'override' but does not override any member functions
を得る:
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