tamamlanmamış bir tür geçersiz kullanımı
Projemde bir alt bir typedef kullanmaya çalışıyorum, bu örnekte benim sorunum izole ettim.
Herkes yanlış gidiyorum nerede biliyor mu?
template<typename Subclass>
class A {
public:
//Why doesn't it like this?
void action(typename Subclass::mytype var) {
(static_cast<Subclass*>(this))->do_action(var);
}
};
class B : public A<B> {
public:
typedef int mytype;
B() {}
void do_action(mytype var) {
// Do stuff
}
};
int main(int argc, char** argv) {
B myInstance;
return 0;
}
Bana böyle çıktı
sean@SEAN-PC:~/Documents/LucadeStudios/experiments$ g -o test test.cpp
test.cpp: In instantiation of ‘A<B>’:
test.cpp:10: instantiated from here
test.cpp:5: error: invalid use of incomplete type ‘class B’
test.cpp:10: error: forward declaration of ‘class B’
CEVAP
Neden bir sınıf şablonu oluşturulurken, tüm bildirimlerinin (tanımlar) üye fonksiyonları çok örneği vardır. Sınıf şablonu bir uzmanlık tam tanımı gerekli olduğunda tam örneği. Bu durumda, örneğin, bir temel sınıf olarak kullanılır.
Peki ne olur A<B>
örneği
class B : public A<B>
tam bir tip değil (hangi sınıf tanımı, kapatma ayracı sonra). , 10**'nin bildirimi B
kapsamında sürünerek çünkü tam olmasını gerektirir: . ancak
Subclass::mytype
Ne yapmanız gereken hangi B
tam yetki almak için örnekleme geciktiriyor. Bunu yapmanın bir yolu action
ilanından bu üye bir şablon yapmak için değiştirin.
template<typename T>
void action(T var) {
(static_cast<Subclass*>(this))->do_action(var);
}
var
doğru türde ise, do_action
17 *geçen başarısız olur, çünkü hala bir tür güvencedir.
ForceLayout kullanımı(), requestLayout...
Özel durum HttpRequest kullanarak.() y...
Profil Yükleme Başarısız oldu Testflig...
Kullanımı "bu" C statik yönt...
`__android_günlük_yazdırma' için b...