Как исправить ошибку C2440: «возврат»: невозможно преобразовать из «int» в «elem *»? - PullRequest
0 голосов
/ 03 апреля 2020

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

Ошибка C2440: «возврат»: невозможно преобразовать из «int» в «elem *»

Проблема в том, что я нашел единственный способ исправить это - изменить его на return = 0, но это сделало бы все это бессмысленным, учитывая, что я хочу, чтобы он возвращал 1, когда я успешно удалил элемент из очереди. У тебя есть идеи как это исправить?

    struct elem { int key;
        elem *next; 
        } *first=NULL, *last=NULL;   

elem *push(int n, elem *&first, elem *&last)  
    { elem *p=last; 
    last=new elem; 
    last->key=n; 
    last->next=NULL; 
    if(p!=NULL) 
        p->next=last; 
    else 
        first=last; 
    } 

elem *pop(int &n, elem *&first, elem *&las) 
           { elem *p=NULL;
           if (first)  
            {       n=first->key; 
                    p=first;  
                    first=first->next;;

                        if (first==NULL) 
                            last=first;  
                         delete p;
                         return 1;       //this here gives me the error
                }      
                else     
                    return 0;
            }

1 Ответ

0 голосов
/ 03 апреля 2020

c ++ не позволит вам преобразовать целочисленный тип в указатель без reinterpret_cast или c-style cast, однако ваша функция вводит в заблуждение и вы делаете вещи, которые никогда не должны выполняться.

char *ptr = 1; // error
char *ptr = reinterpret_cast<char*>(0x164651); // compiles but you must make sure this address will be valid !

Вы объявите вашу функцию для возврата elem * и сделайте это указанием на успех или неудачу. В этом случае вы должны вернуть nullptr в случае неудачи и указатель на нажатый или вытолкнутый элемент в случае успеха.

elem *pop(int &n, elem *&first, elem *&las) 
           { elem *p=NULL;
           if (first)  
            {       n=first->key; 
                    p=first;  
                    first=first->next;;

                        if (first==NULL) 
                            last=first;  
                         return p;       // return the popped element to the caller
                }      


else     
                return nullptr; // failed to pop any element
        }

Если вы настаиваете на указании успеха и неудачи значениями 1 и 0, поэтому вы должны использовать целочисленный тип в качестве возвращаемого типа без указателя.

int pop(int &n, elem *&first, elem *&las) // returns 1 on success otherwise 0

, а в c ++ лучше использовать исключения для обозначения сбоя , Это позволяет отделить путь ошибки от пути возврата и сохранить большую часть проверки ошибок, которую вы будете выполнять большую часть времени. Поэтому всегда используйте исключения c ++ и RAII, если это возможно, это значительно сэкономит вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...