2010-11-18 29 views
5

Şablonlu bir sınıf tanımlamak için üç farklı dosyayı düşünürüm. Bildiri, bir .h dosyasında, yöntemlerin bir .cpp dosyasında yer alması ve açık örneklerin bir .inc dosyasına eklenmesi (.cpp'nin sonuna bir satır ekleyerek, örneğin: #include "bar-impl.inc").Şablon türlerini şablon olmayan parametreli yöntemlerden döndürme

Şimdi, işte benim sorunum. İki şablon sınıfım var: Foo<S> ve Bar<T>. Bar<T> sınıfın, bir şablon Tipi FooType* döndüren bir yöntem (benim açık örneklemi olan ben, örneğin olmasını istiyorum, hangi Foo<float>*)

template<class T> 
class Bar{ 
.... 
template <class FooType> 
FooType* doSomething(int); 
.... 
}; 

ettik İçinde derleyici ne bilmiyor yana FooType*, bar-impl.inc dosyasında doSomething yöntemini açık bir şekilde başlatmaya çalıştım.

//bar-impl.inc 
template class Foo<float> * Bar<float>::doSomething(int); 

Ancak, işe yaramadı ve ben bir hata alıyorum: no matching function for call to ‘Bar<float>::doSomething(int&)’ make: *** [main] Error 1

herkes bunu yapmak mümkün olup olmadığını bilir mi?

cevap

1

Yöntemler şablonları, işlev şablonlarıyla tam olarak aynı şekilde çalışır. Şablon parametreleri çağrıdan elde edilemediği sürece, bunları kullanımda açık bir şekilde başlatmanız gerekir.

Yani gerçekten ne yapmak gerek kullanım sırasında FooType belirtmek olduğunu, bir uzmanlık yapmak gerekmez: Her zaman Foo<T>* dönmek isterseniz

Bar<float> somevar; somevar.doSomething< Foo<float> >(somevalue);

sonra sadece kullanmak Foo<T>* doSomething(int);

+0

Teşekkürler! ama beyanı şablon sınıfının örneğinden ayırdığımdan, açık bir örneği yapmak için her halükarda ihtiyacım var, değil mi? – Javier

+0

@Javier Şablon kodunuzu '.cpp' dosyalarının içine koyarsanız, derleyicinin bunu sizin için yapamayacağından, tüm şablonları açıkça başlatmanız gerekir. Ama sahip olduğunuz problem ilgisiz. Şablonlu bir yönteminiz var ve şablon olmayan bir yöntemi çağırıyorsunuz (ki bu mevcut değil). Tamam –

+0

, bu yüzden, ben sahip olmalıdır: şablon sınıf Bar { .... şablon Foo * doSomething (int); .... }; önerdiğin şey bu mu? Ya da her zaman Foo * 'u iade etmeyi istemem. Üzgünüm, biraz kafam karıştı. DoSomething yöntemini nasıl arayacağımı anlatan bir "main.cpp" örneğini dahil etmeyi düşünüyor musunuz? – Javier