Как создать шаблон C ++?

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

#include <iostream>
using namespace std;
template <class T>
T myfunc(T x)
{
return x*x;
}
template<>
string myfunc<string>(string ss)
{
return (ss+ss);
}
int main()
{
cout<<myfunc("test")<<endl;
return 0;
}

Компиляция завершается неудачно с:

ошибка C2784: ‘std :: _ String_iterator<_Mystr> std :: operator
+ (_ String_iterator<_Mystr> :: difference_type, станд :: _ String_iterator<_Mystr>)»
: не удалось вывести аргумент шаблона для
«Станд :: _ String_iterator<_Mystr> ‘из’ std :: string ‘

Не могли бы вы помочь мне определить, где именно проблема?

1

Решение

Вам нужно передать функции строку, а не массив символов. Пытаться myfunc(string("test"))

Чтобы немного расширить — выбор того, какой шаблон / специализация шаблона использовать при вызове функции, называется вычетом аргумента шаблона.

Вы хотите, чтобы вызывался myfunc, однако тип теста — char [5] (нулевой символ в конце). Поэтому аргумент шаблона «выводится» как char [5].

Часто char [] может быть приведена к строке неявно (я считаю, что это устарело) при вызове полностью специализированной функции (а не функции шаблона). Это неявное приведение происходит потому, что, как указал user1274223, std :: string имеет конструктор со строкой подписи (const char *), и этот конструктор не явно! Это полезно, когда мы хотим сделать вид, что строки c (char *) легко взаимозаменяемы со строками cplusplus (std::string), однако это может привести к путанице в подобных ситуациях.

Другая работа вокруг myfunc<string>("test")потому что здесь аргумент шаблона передается напрямую, и char [] может быть приведен косвенным образом.

5

Другие решения

Специализация шаблона в этом случае не нужна, вам просто нужно перегрузить функцию:

std::string myfunc(const std::string &ss)
{
return (ss+ss);
}

Таким образом, называя это как myfunct("test") буду работать.

Чтобы узнать все подробности, почему специализации шаблонов функций обычно не используются, вы можете взглянуть на статью Херба Саттера. Почему бы не специализировать шаблоны функций?

1

Как уже говорили другие.
Кроме того, я думаю, что вам нужно

#include <string>

в котором оператор + для строк и сама строка объявлены
ошибка, которую вы получаете, это то, что ваш компилятор пытается сопоставить все другие операторы + in и не удалось.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector