возврат типов шаблонов из не шаблонных параметризованных методов - PullRequest
5 голосов
/ 18 ноября 2010

Чтобы определить шаблонный класс, я рассмотрю три разных файла. Объявление находится в файле .h, внедрения методов - в файле .cpp, а явные экземпляры включены в файл .inc (путем добавления строки в конце .cpp, например: #include "bar-impl.inc" ).

Теперь вот моя проблема. У меня есть два класса шаблонов, скажем: Foo<S> и Bar<T>. Внутри класса Bar<T> у меня есть метод, который возвращает шаблон Type FooType* (который с моим явным созданием экземпляра я бы хотел, например, Foo<float>*)

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

Поскольку компилятор не знает, что такое FooType*, я попытался явно создать экземпляр метода doSomething в файле bar-impl.inc.

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

Однако это не сработало, и я получаю сообщение об ошибке: no matching function for call to ‘Bar<float>::doSomething(int&)’ make: *** [main] Error 1

Кто-нибудь знает, возможно ли это сделать?

1 Ответ

1 голос
/ 18 ноября 2010

Шаблоны методов работают точно так же, как шаблоны функций.Вам нужно явно создавать их экземпляры при использовании, если только параметры шаблона не могут быть получены из вызова.

Так что вам не нужно делать специализацию, вам нужно указать FooType при использовании:

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

Если вы всегда хотите вернуть Foo<T>*, просто используйте Foo<T>* doSomething(int);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...