2010-11-18 17 views
5

Aby zdefiniować klasę szablonową, biorę pod uwagę trzy różne pliki. Deklaracja znajduje się w pliku .h, implenty metod znajdują się w pliku .cpp, a jawne wystąpienia są zawarte w pliku .inc (przez dodanie linii na końcu pliku .cpp, np .: #include "bar-impl.inc").Powracanie typów szablonów z metod sparametryzowanych bez szablonów

Oto mój problem. Mam dwie klasy szablonów, powiedzmy: Foo<S> i Bar<T>. Wewnątrz klasy Bar<T>, mam metodę, która zwraca szablon Rodzaj FooType* (co z moim wyraźnej instancji Chciałbym to być, na przykład, Foo<float>*)

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

Ponieważ kompilator nie wie, co FooType* jest, próbowałem jawnie utworzyć instancję metody doSomething w pliku bar-impl.inc.

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

Jednak to nie działa i pojawia się błąd: no matching function for call to ‘Bar<float>::doSomething(int&)’ make: *** [main] Error 1

Czy ktoś wie, czy jest możliwe, aby to zrobić?

Odpowiedz

1

Szablony metod działają dokładnie tak samo, jak szablony funkcji. Musisz ich jawnie utworzyć podczas użycia, chyba że parametry szablonu można wyprowadzić z połączenia.

Tak naprawdę nie trzeba zrobić specjalizację, co trzeba zrobić, to określić FooType po użytku:

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

Jeśli zawsze chcesz powrócić Foo<T>* następnie wystarczy użyć Foo<T>* doSomething(int);

+0

Dzięki! ale odkąd odłączyłem deklarację od instancji klasy szablonowej, potrzebuję w każdym przypadku wykonać jawną instancję, czyż nie? – Javier

+0

@Javier Jeśli umieścisz swój kod szablonu w plikach '.cpp', musisz jawnie utworzyć instancje wszystkich szablonów, ponieważ kompilator nie może tego zrobić dla ciebie. Ale problem, który masz, nie ma związku. Masz szablonową metodę i próbujesz wywołać metodę bez szablonu (która nie istnieje). –

+0

ok, więc powinienem mieć: template class Bar { .... szablon Foo * doSomething (int); .... }; czy to sugerujesz? A co, jeśli nie chciałbym zawsze zwracać Foo *. Przepraszam, jestem nieco zdezorientowany. Czy uwzględniacie przykład 'main.cpp' na temat jak mogę wywołać metodę doSomething? – Javier

Powiązane problemy