LINUX.ORG.RU

О шаблонных функциях в C++


0

0

template <class T>
T& func(std::string str)
{
//Implementation
}

...
...
...

std::string S = func("Hello");

Выдаёт ошибку - could not deduce template argument for 'T'

Почему автоматом не понял, что инстанцируется классом std::string ???
Как получить желаемый эффект???


Насколько я помню в подобном случае компилятор не может определить что ты хочешь. Другое дело типы входных переменных.

anonymous
()

>std::string S = func("Hello");
попробуй так:
std::string S = func<std::string>("Hello");

а здесь могут быть серьезные проблемы
T& func(std::string str)
надежней
T func(std::string str)

а если уж очень хочется оптимизировать,
то лучше использовать "умные" указатели, например shared_ptr из www.boost.org или в худшем случае std::auto_ptr. Получится что то типа:

template <class T>
boost::shared_ptr<T> funct ( const str& str)

anonymous
()
Ответ на: комментарий от anonymous

>boost::shared_ptr<T> funct ( const str& str)

boost::shared_ptr<T> funct ( const std::string& str)

anonymous
()

проблема в том, что с такого шаблона может получиться только одна функция (если вообще получиться :)), т. к. у всех функций порождаемых шаблоном будет одна и та же сигнатура...

k_andy ★★★
()

Полный бред

#include <iostream>

std::string tmpl(std::string str)
{
  return str;
}

int tmpl(std::string str)
{
  return str.size();
}

int main () 
{
  std::string str = "str";
  tmpl(str); // ну и какой tmpl в этом случае звать ?
}

или я не понял чего пытаешся сделать ..

halflife ★★
()

>template <class T>
>T& func(std::string str)
>{
>//Implementation
>}
>
>...
>...
>...
>
>std::string S = func("Hello");
>
>Выдаёт ошибку - could not deduce template argument for 'T'
>
>Почему автоматом не понял, что инстанцируется классом std::string ???
>Как получить желаемый эффект???

Как вариант можно сделать:
void func( T& T_ref, std::string str)
{
...
}

stalcker
()
Ответ на: комментарий от stalcker

Если такая функция вообще имеет смысл, то это лучшее решение :)

k_andy ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.