2009-05-30 6 views
2

Точное предупреждение, которое я получаюЧто означает «предупреждение: не все пути управления возвращают значение» означает? (C++)

warning C4715: 'hand::show' : not all control paths return a value 

и руки :: шоу

std::ostream& hand::show(std::ostream& os) const 
{ 
    if(side == left) 
    { 
     return os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4]; 
    } 
    if(side == right) 
    { 
     return os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0]; 
    } 
} 

где сторона является переменной ориентации типа

orientation{ 
    left = -1, 
    right = 1 
}; 

Что делает предупреждение означает, и что было бы лучшим решением, чтобы избавиться от него?

ответ

11

Ваш компилятор не достаточно умен, чтобы принять во внимание, что только два варианта side: left и right, поэтому он считает невозможным выполнение любого оператора return. Когда side не является ни left, ни right, ваша функция не скажет, какое значение вернуть.

7

Ошибка означает, что если сторона не находится ни влево, ни вправо, ваша функция не вернет значение - любая из сторон объявляется неправильно или перечислите. Перечисление должно быть определено как

enum orientation {left, right}; 

Так что попробуйте изменить свою структуру ориентации.

4

Предупреждение означает, что вы можете пройти через свой метод, не возвращая явного значения. С вашим кодом:

std::ostream& hand::show(std::ostream& os) const 
{ 
    if(side == left) 
    { 
     return os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4]; 
    } 
    if(side == right) 
    { 
     return os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0]; 
    } 
} 

если side != left и side != right, то вы ничего не вернуть. Наиболее распространенный способ крепления этой проблемы заключается в предположении, например, если не «левый», то всегда будем считать «право»:

std::ostream& hand::show(std::ostream& os) const 
{ 
    if(side == left) 
    { 
     return os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4]; 
    } 
    return os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0]; 
} 
2

Чтобы избавиться от предупреждения, заменить второй if с else:

std::ostream& hand::show(std::ostream& os) const 
{ 
    if(side == left) 
    { 
     return os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4]; 
    } 
    else 
    { 
     return os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0]; 
    } 
} 
3

Вы можете делать то, что STH сказал, или, так как в этом случае вы действительно возвращаются одно и то же в любом случае. ..

std::ostream& hand::show(std::ostream& os) const 
{ 
    if(side == left) 
    { 
     os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4]; 
    } 
    else 
    { 
     os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0]; 
    } 
    return os; 
} 
1

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

  1. изменить второе, если заявление еще, или удалить условие все вместе, так как если сторона не осталось, он должен быть правильным.
  2. следуйте предложению Натаниэля Флата и измените тип ориентации на перечисление.
  3. вызывает исключение в качестве последнего утверждения функции.
6

Если side не left или right, то возвращаемое значение не определено.

Даже если orientation это перечисление только два значения (прямо сейчас), он все еще может иметь различное значение для любого из следующих причин:

  • В будущем вы можете изменить заголовок, чтобы включить другие значения в перечислении, поэтому защитное программирование предполагает, что это произойдет (и ваш компилятор будет приятным и предупреждает вас сейчас).
  • side может быть инициализирован, так что это может быть ни left, ни right
  • side может быть присвоено другое значение через типажей, например, *((int*)&side) = 2

Возможные решения включают в себя:

  • Заменить второй if с else как это было предложено СТГ.
  • Изменить это будет:

    if(side == left) { 
        return ...; 
    } else if(side == right) { 
        return ...; 
    } else { 
        ...handle error... 
    } 
    

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

  • Нет связанных вопросов^_^