次の簡単なプログラムを 3 回繰り返してみました。これは、コンテナーとイテレーターのペアのクラスを作成するための非常に単純化された試みですが、不完全な型 (前方宣言) に関する問題に遭遇していました。すべてをテンプレート化すると、これが実際に可能であることがわかりました-ただし、実際にテンプレートパラメーターを使用した場合のみ! ( Google sparsetable codeを見てこれに気づきました。)
2番目が機能するのに3番目が機能しない理由を説明するヒントはありますか? (最初のものが機能しない理由はわかっています。コンパイラはコンテナーのメモリ レイアウトを知る必要があります。)
前もって感謝します。
// This doesn't work: invalid use of incomplete type.
#if 0
struct container;
struct iter {
container &c;
int *p;
iter(container &c) : c(c), p(&c.value()) {}
};
struct container {
int x;
int &value() { return x; }
iter begin() { return iter(*this); }
};
int main() {
container c;
c.begin();
return 0;
}
#endif
// This *does* work.
template<typename T> struct container;
template<typename T> struct iter {
container<T> &c;
T *p;
iter(container<T> &c) : c(c), p(&c.value()) {}
};
template<typename T> struct container {
T x;
T &value() { return x; }
iter<T> begin() { return iter<T>(*this); }
};
int main() {
container<int> c;
c.begin();
return 0;
};
// This doesn't work either.
#if 0
template<typename T> struct container;
template<typename T> struct iter {
container<int> &c;
int *p;
iter(container<int> &c) : c(c), p(&c.value()) {}
};
template<typename T> struct container {
int x;
int &value() { return x; }
iter<int> begin() { return iter<int>(*this); }
};
int main() {
container<int> c;
c.begin();
return 0;
}
#endif