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ć?
Dzięki! ale odkąd odłączyłem deklarację od instancji klasy szablonowej, potrzebuję w każdym przypadku wykonać jawną instancję, czyż nie? – Javier
@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). –
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