ошибка? чего не так с "K"?
Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
бот это прикольно, но не понятно((
template < template < typename > typename K, typename V > vector<double> ComputeTfldfs(K<V> documents, V word) /* ... */ Edit: Шаблон != элиас типа.
а к такой как? vector<double> ComputeTfIdfs(V2<V1<S>> documents, S word);
Так же, поскольку V1<S> - тип, а V2 - шаблон. Если V1 - тоже параметр шаблона (описываемого), то опишите оба: template < template < typename > typename V1, template < typename > typename V2, typename S > /* ... */
спасибо!!! но логику уловить не могу(( надо что-то почитать
Полная специализация шаблона типа (template </* ... */> class|struct с полным списком предоставленных аргументов) идентифицирует конкретный тип. В противном случае это все еще шаблон, требующий предоставления таковых. Шаблоны типов (без предоставленных аргументов) != типы; специализации шаблонов типов (с предоставленными) == типы. В списке шаблонных параметров typename "элиасит" (наподобие того, как это делает typedef/using) по-умолчанию тип; для элиасинга шаблона (наподобие template </* ... */> using) используется соответствующая грамматическая форма параметра (template </* ... */> typename). В частности, в рамках Вашего примера, и V1, и V2 представляются шаблонами типов с одним шаблонным параметром-типом, в то время как S - обычный параметр-тип. Так Вы их в списке параметров корневого шаблона и описываете (мой последний пример). Edit: Например V1<S> - это typename (поэтому, чтобы его принять, требуется шаблон template < typename > typename V2), в то время как сам V1 (без аргументов) - template < typename > typename.
сам себя запутал(( из этого vector<double> ComputeTfIdfs(const vector<vector<string>>& documents, const string& word) надо было это сделать template < typename K, typename S> vector<double> ComputeTfIdfs(const K& documents, const S word)
Всё ещё неправильно :( Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
Вы можете сделать и так, просто таким образом не налагаете никаких ограничений на первый параметр функции. vector<vector<string>> - действительно обычный тип, который заэлиасится typename'ом. Однако туда же ляжет и int, например. Если Вы хотите ограничить исключительно подобную вложенность специализаций для первого параметра - мой пример все еще в силе (и первый параметр с его учетом будет объявляем как const V1<V2<S>>& (или наоборот), если разность типов шаблонов-контейнеров допускается). Ваш же последний пример (с vector<vector<string>>) ляжет и в нижеследующее: template < template < typename > typename Vector, typename String > vector<double> ComputeTfIdfs(const Vector<Vector<String>>&, const String&) /* ... */ Как Вы понимаете, параметры шаблона можно использовать и в описании типа возвращаемого значения, если требуется (в частности, сделать его Vector<double>).
Обсуждают сегодня