SORU
16 Mart 2009, PAZARTESİ


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
16 Mart 2009, PAZARTESİ


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • eurotuner

    eurotuner

    6 Mart 2006
  • Majestic Casual

    Majestic Cas

    28 NİSAN 2012
  • RaverX DouBle StAg XI

    RaverX DouBl

    23 Mayıs 2008