Aşağıdaki basit programın üç yinelemesini denedim. Bu, kapsayıcı ve yineleyici bir sınıf çifti yazmak için oldukça basitleştirilmiş bir girişimdir, ancak tamamlanmamış türlerle (ileri bildirimler) sorunlara koşuyordum. Herşeyi tempize ettikten sonra bunun aslında mümkün olduğunu keşfettim - ama sadece şablon parametresini kullansaydım! (Bunu, Google sparsetable code'a bakarak farkettim.)C++ şablonları neden eksik türleri (ileri bildirimler) atlamama izin veriyor?
İkinci neden üçüncü sırada çalışmayanı açıklayan tüm ipuçları? (Neden birinin işe yaramadığını biliyorum - derleyicinin kapsayıcının bellek düzenini bilmesi gerekir.)
Şimdiden teşekkürler.
// 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
Aslında "ne işe yaramazsa" ne daha spesifik olabilir misiniz? Derleme başarısız mı, eğer öyleyse mesaj nedir? Doğru koşmayı başaramaz mı, eğer öyleyse bunu beklemediğini ne yapar? –
, belirttiğim iletiyle derlemeyi başaramadı: "tamamlanmamış türde geçersiz kullanım." – Yang