#include <iostream>
using namespace std;
template <class U>
U add (U a, U b)
{
U c = 0 ;
c = a + b;
return c;
}
int main()
{
int first = 2;
int second = 2;
U result = 0;
result = add(first, second);
cout << result << endl;
return 0;
}
Я хочу объявить тип данных переменной результата, используя тип данных шаблона, чтобы моя программа добавления была универсальной, но компилятор выдает мне эту ошибку «результат не был объявлен в этой области».
То, что вы пытаетесь сделать, невозможно. Вы можете использовать только U в вашей функции добавления.
Тем не менее, вы можете сделать это вместо
auto result = add(first, second);
Или же
decltype(auto) result = add(first, second);
В вашем случае оба будут делать то же самое. Однако они совершенно разные. Короче говоря, decltype(auto)
всегда получит вам точный тип, возвращаемый add
, в то время как auto
может нет.
Быстрый пример:
const int& test()
{
static int c = 0;
return c;
}
// result type: int
auto result = test();
// result type: const int&
decltype(auto) result = test();
Если вы хотите узнать больше об авто, Скотт Мейерс прекрасно это объясняет:
CppCon 2014: Скотт Мейерс «Вывод типа и почему вы заботитесь»
Альтернатива превосходному предложению Хосе, которое позволит вам разделить декларацию и «инициализацию» (которая тогда будет только назначением, как в вашем вопросе), это:
decltype(add(first, second)) result = 0;
result = add(first, second);
Но, очевидно, блин.