2015-11-05 4 views
2

я взял этот пример прямо из книги (Sams Teach Yourself C++ in One Hour a Day):Почему я не могу вернуть ссылку из этой функции шаблона?

// Get the maximum of two values 
template <typename objectType> 
objectType& GetMax(const objectType& value1, const objectType& value2) 
{ 
    if (value1 > value2) 
     return value1; 
    else 
     return value2; 
} 

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

Я пытался использовать функцию следующим образом:

// Test the Max function 
int x_int = 25; 
int y_int = 40; 
int max_int = GetMax(x_int, y_int); 
cout << "max_int: " << max_int << endl; 

double x_double = 1.1; 
double y_double = 1.001; 
double max_double = GetMax(x_double, y_double); 
cout << "max_double: " << max_double << endl; 

Однако, когда я пытаюсь скомпилировать и запустить код, я получаю следующие ошибки:

Ошибка 1 Ошибка C2440: «возвращение ': не удается преобразовать из 'сопзЬ Int' в 'INT &'

ошибка 2 ошибка C2440: 'возвращение': не удается преобразовать из 'сопзЬ Int' на 'Int &'

Ошибка 3 Ошибка C2440: 'возвращение': не удается преобразовать из 'Const двойной' до 'двойной &'

Error 4 ошибки C2440: 'возврата': не удается преобразовать из 'Const двойной' до 'двойной &'


Если я просто удалить & от типа возвращаемого значения функции будет скомпилировать и выполнить успешно.

Почему я не могу вернуть ссылку с этой функции? Является ли книга неправильной или что-то мне не хватает?

+1

Вы должны вернуть 'const &' – JSF

ответ

7

Проблема заключается в том, что часть декларации аргумента составляет const. Переменные value1 и value2 являются ссылками на значения константы, но вы возвращаете ссылку на непостоянное значение.

+0

Вот и все! Странная вещь после того, как я добавил в нее «const», Visual Studio решила подчеркнуть ее красным примерно на 10 секунд, заставив меня подумать, что это была ошибка, хотя это не было ... * facepalm * – tjwrona1992

5

Ошибка объясняет все это, вы не можете вернуть неконстантную ссылку на ссылку const.

// Get the maximum of two values 
template <typename objectType> 
const objectType& GetMax(const objectType& value1, const objectType& value2) 
{ 
    if (value1 > value2) 
     return value1; 
    else 
     return value2; 
} 
1

Вы должны указать, на какие строки ссылаются ошибки (а также отправить полную программу, которую другие могут просто скопировать/вставить в свой редактор).

Но я ожидаю, что они относятся к этой линии

return value1; 

и одноименным один за ним.Ошибки сказать вам точно, что это не так:

cannot convert from 'const int' to 'int &' 

И действительно, если мы исследуем детали того, что эта линия пытается сделать, мы видим, что вещь, которую вы пытаетесь вернуться в Уст:

const objectType& value1 

но тип функция обещает вернуть это nonconst Другой крупный:

objectType& GetMax 
0

Возвращаемый тип функции GetMax является ссылкой, но вы пытаетесь Ретур n переменная, которая является ссылкой const.

Это недопустимо, и компиляция не удалась.

Попытки обойти этот механизм с помощью const_cast на value1 и value2 опасно, так как поведение на отбрасывая const ности от стоимости, которая была первоначально const не определенно.

Очевидное, что нужно сделать, это изменить тип возврата GetMax на ссылку const.

Смежные вопросы