2011-01-03 4 views
4

Я внедрил общий список, и я пытаюсь получить данные из определенной позиции в списке. umm ... но я получаю сообщение об ошибке: нет соответствующей функции для вызова «List :: retrieve (int &, Запись &)» Ниже приведен код main.cpp и фрагмент функции из List.h. #includeНет соответствующего вызова функции члену класса

main.cpp

#include <iostream> 
#include "List.h"  
#include "Key.h" 
using namespace std; 
typedef Key Record; 
int main() 
{ 
    int n; 
    int p=3; 
    List<int> the_list; 
    Record data; 
    cout<<"Enter the number of records to be stored. "<<endl; 
    cin>>n; 
    for(int i=0;i<n;i=i++) 
    { 
    the_list.insert(i,i); 
    } 
    cout<<the_list.size(); 
    the_list.retrieve(p, data); 
    cout<<"Record value: "<<data; 
    return 0; 
} 

list.h

Error_code retrieve(int position, List_entry &x)const 
    { 
    if(empty()) return underflow; 
    if(position<0 || position>count) return range_error; 
    x=entry[position]; 
    return success; 
    } 

Для полного кода:

main.cpp: http://pastebin.com/UrBPzPvi

list.h: http://pastebin.com/7tcbSuQu

P.S Я просто обучение основам и код не может быть совершенным в отношении крупномасштабного многократного использования модуля. На этом этапе ему просто нужно работать.

Благодаря

ответ

6

data, который вы пытаетесь передать в качестве второго аргумента retrieve, имеет тип Record.

Второй параметр retrieve имеет тип List_entry, а не Record.

Когда компилятор говорит «нет соответствующей функции», это обычно означает, что он нашел функцию с именем, которое вы использовали, но один или несколько аргументов, которые вы пытаетесь передать этой функции, имеют неправильный тип, или вы пытаются передать неправильное количество аргументов функции.

+0

ummm ... Спасибо. Как мне изменить функцию извлечения списка, чтобы его можно было использовать, как я указал выше в своем сообщении? – Cipher

+0

@user: Измените тип параметра или измените тип 'data'? –

1

Ошибка «Отсутствие подходящей функции для вызова [...]» обычно означает «Я не могу найти функцию, которую вы можете вызвать со следующими аргументами». Это может означать много вещей - либо вы ошибочно написали имя функции, либо аргументы неправильного типа, либо вы пытаетесь вызвать функцию non-const-члена в объекте const и т. Д. Обычно ошибка дает вам некоторые более подробно о том, что пошло не так, включая функции, которые он пытался сопоставить, а также типы аргументов, которые были фактически найдены на сайте вызова. Шаблоны могут сделать это труднее читать, но с небольшим временем вы обычно можете научиться их читать.

В отношении этого кода второй аргумент функции retrieve имеет тип List_entry, который является параметром шаблона для List. В вашей основной функции вы создаете экземпляр списка, поэтому List_entry является int в этом случае. Однако вы пытаетесь найти запись, которая (я полагаю) не является int. Если вы либо измените код, чтобы попытаться найти int, либо сделать список List List, эта проблема должна исчезнуть.

Надеюсь, это поможет!

+0

Я думаю, что запись имеет тип int. Я сделал запись псевдонима для класса Key. Если бы вы могли указать, вот код для класса Key. Key.h-> http://pastebin.com/zMVRj2Tr и Key.cpp -> http://pastebin.com/NuCyeBpj – Cipher

+0

А ...обратите внимание, что ваш класс Key завершает целое число (внутри, так оно реализовано), но в конце дня оно/не является/целым числом. Это класс, тип которого Key, который имеет принципиально другой тип от int. Вы определили неявные преобразования из ints в Keys (через ваш конструктор Key (int x = 0)), но нет возможности конвертировать из ключа в int неявно. Чтобы заставить ваш код работать, измените the_list.retrieve (p, data); для чтения the_list.retrieve (p, data.the_key()); Это переходит в целочисленную часть ключа в функцию, которая должна исправлять ситуацию. – templatetypedef

+0

Я изменил это на the_lsit.retrieve (p, data.the_key()); но я все еще получаю эту ошибку: никакой подходящей функции для вызова в «Список :: retrieve (int &, int)» – Cipher

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