Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
6 / 6 / 6
Регистрация: 16.12.2013
Сообщений: 69
1

Template argument required for class "LinkedListIterator"

04.11.2014, 15:15. Показов 1835. Ответов 9
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#include <iostream>
 
using namespace std;
 
template <typename Type>
class Linkedlist
{
private:
    struct Elem
    {
        Type info;
        Elem *next;
    };
 
    Elem *head;
    Elem *tail;
    int count;// ЗДЕСЬ ОШИБКА!!!!
 
public:
    friend class LinkedListIterator;
    Linkedlist();
    ~Linkedlist();
 
    void add_to_end(Type info);
    Type operator [] (int index);
    int GetCount();
};
 
template <typename Type>
Linkedlist <Type>::Linkedlist()
{
  head=NULL;
  count=0;
 
}
template <typename Type>
void Linkedlist<Type>::add_to_end(Type info)
{
    if(head==NULL)
    {
        head=new Elem;
        head->info=info;
        head->next=NULL;
        tail=head;
    }
    else
    {
        tail->next=new Elem;
        tail=tail->next;
        tail->info=info;
        tail->next=NULL;
    }
 
    count++;
}
 
template <typename Type>
Type Linkedlist<Type>::operator [] (int index)
{
    Elem *cur=head;
    for(int i=0;i<index;i++)
    {
        cur=cur->next;
    }
    return cur->info;
}
template <typename Type>
Linkedlist<Type>::~Linkedlist()
{
    Elem *cur_del=head;
    Elem *cur_light=head->next;
    do
    {
        delete cur_del;
        cur_del=cur_light;
        cur_light=cur_light->next;
    }
    while(cur_light!=NULL);
    delete cur_del;
    head=NULL;
    count=0;
 
}
 
template <typename Type>
int Linkedlist <Type>::GetCount()
{
    return count;
}
 
template <typename Type>
class LinkedListIterator
{
private:
 
 
    Linkedlist <Type> *linkedListPointer;
    typename Linkedlist<Type>::Elem* cur;
 
public:
    LinkedListIterator(Linkedlist <Type> *linkedListPointer);
    void Begin();
    void End();
    void MoveNext();//perehood na sledushii
    Type GetCurrent();
    bool IsFinish();
 
};
 
template <typename Type>
LinkedListIterator <Type> :: LinkedListIterator(Linkedlist <Type> *linkedListPointer)
{
    this->linkedListPointer=linkedListPointer;
    cur=NULL;
}
template <typename Type>
void LinkedListIterator <Type> :: Begin()
{
    cur=linkedListPointer->head;
}
template <typename Type>
void LinkedListIterator <Type> :: End()
{
    cur=linkedListPointer->tail;
}
template <typename Type>
void LinkedListIterator <Type> ::  MoveNext()
{
    cur=cur->next;
}
template <typename Type>
Type LinkedListIterator <Type> :: GetCurrent()
{
    return cur->info;
}
template <typename Type>
bool LinkedListIterator <Type> :: IsFinish()
{
    if (cur==NULL)
    {
        return true;
    }
    else
    {
        return false;
    }
}
 
 
 
#endif // LINKEDLIST_H
Подскажите ребят как эту ошибку исправить
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.11.2014, 15:15
Ответы с готовыми решениями:

Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier
Решил подправить свой класс с использованием шаблонов, но столкнулся со следующим косяком. Если я...

'MyQueue' : use of class template requires template argument list
Написал код про шаблоны. Не могу понять почему выводит ошибку во время наследования класса. ошибки...

Friend template class with template class argument
Помогите подружить 2 класса: Имеется класс Student: template &lt;class _T&gt; class Faculty; class...

Ошибка "template argument 1 is invalid"
Приветствую! Слабое знание английского не помогло мне найти ответа на stackoverflow, поэтому...

9
49 / 43 / 21
Регистрация: 17.03.2014
Сообщений: 135
04.11.2014, 16:08 2
Бога ради, когда вставляете такой кусок исходника, форматируйте его как код С++. Представляете, насколько трудно читать, что Вы написали? Делайте так:
C++
1
2
3
4
5
int main()
{
    setlocale(LC_ALL, "russian");
    srand(time(NULL));
..................................
0
Эксперт PHP
3035 / 2544 / 1194
Регистрация: 14.05.2014
Сообщений: 7,126
Записей в блоге: 1
04.11.2014, 16:49 3
Цитата Сообщение от raister32 Посмотреть сообщение
friend class LinkedListIterator;
Шаблонный класс. Может так?
C++
1
friend class LinkedListIterator<Type>;
0
6 / 6 / 6
Регистрация: 16.12.2013
Сообщений: 69
04.11.2014, 16:55  [ТС] 4
не помогает, к сожалению. Еще одна ошибка появляется, LinkedListIterator is not a class template.
0
С чаем беда...
Эксперт CЭксперт С++
9432 / 4928 / 1348
Регистрация: 18.10.2014
Сообщений: 11,471
04.11.2014, 19:46 5
Цитата Сообщение от raister32 Посмотреть сообщение
как эту ошибку исправить
Какую ошибку? Где? Кто будет в посте указывать точный тест ошибки и точное положение ошибки? И советую стараться не врать - та строка, которую вы пометили в своем коде никакой ошибки вызвать не может.
0
6 / 6 / 6
Регистрация: 16.12.2013
Сообщений: 69
04.11.2014, 20:12  [ТС] 6
А я не вру, могу скриншот предоставить!

Добавлено через 3 минуты
http://floomby.ru/s1/cetTrC вот ссылка на скриншот.
0
С чаем беда...
Эксперт CЭксперт С++
9432 / 4928 / 1348
Регистрация: 18.10.2014
Сообщений: 11,471
04.11.2014, 20:19 7
Лучший ответ Сообщение было отмечено raister32 как решение

Решение

Ошибка в вашем коде заключается в том, что на момент friend-объявления класс 'LinkedListIterator' еще совершенно не известен. Поэтому ваше friend-объявление, согласно правилам языка, ссылается на новый нешаблонный класс 'LinkedListIterator' расположенный в глобальном пространстве имен. Позже вы вдруг объявляете 'LinkedListIterator' как шаблонный класс. Это противоречит тому, что сделало ваше friend-объявление. Отсюда ошибка.

В каком месте компилятор отрапортует ошибку зависит от компилятора, но то, что это произойдет в том месте, которое вы пометили в коде - невероятно. Старайтесь в будущем отмечать реальное, а не выдуманное место ошибки.

Теперь о том, как это исправить. В данном случае все зависит от того, чтоб вы пытаетесь сделать.

1. В простейшем случае вам надо просто исправить ваше friend-объявление на

C++
1
template <typename> friend class LinkedListIterator;
Такое friend-объявление опять же ссылается на неизвестный идентификатор 'LinkedListIterator', но в этом случае оно явно говорит, что 'LinkedListIterator' - это шаблон, зависящий от одного типового параметра.

Однако такой способ объявления друга сделает любую специализацию 'LinkedListIterator' другом для любой специализации 'Linkedlist'. Т.е., например, 'LinkedListIterator<double>' сможет лазить внутрь 'LinkedList<int>'. Это излишне.

2. Если вас не устраивает такая избыточная дружба, то вы можете поступить более детально - сделать другом только одну специализацию 'LinkedListIterator', а именно - 'LinkedListIterator<Type>'. Для этого придется сделать предварительное объявление шаблона 'LinkedListIterator' перед шаблоном 'LinkedList' и исправить синтаксис friend-объявления

C++
1
2
3
4
5
6
7
8
9
template <typename> class LinkedListIterator;
 
template <typename Type>
class Linkedlist
{
    ...
    friend class LinkedListIterator<Type>;
    ...
};
Все. В таком варианте 'LinkedListIterator<double>' будет другом только для 'LinkedList<double>', но не для 'LinkedList<int>'.

3. Но по уму вам стоило бы прекратить на всю эту возню с друзьями, а вместо этого сделать 'Iterator' вложенным классом внутри шаблона 'LinkedList', т.е. именно то, что вы сделали с 'Elem'. Зачем вы вытащили итератор наружу?
1
6 / 6 / 6
Регистрация: 16.12.2013
Сообщений: 69
04.11.2014, 20:30  [ТС] 8
Большое спасибо за подробное объяснение данной проблемы. Итератор был отдельным заголовочным файлом, были другие ошибки, чтобы их исправить пришлось итератор перенести в Линкедлист, по поводу вложенного класса почему то сразу не подумал об этом.

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <Basket.h>
#include <LinkedList.h>
 
 
Basket::Basket()
{
    totalPrice=0;
}
 
void Basket::AddToBasket(Produkt *info)
{
    listProdukts.add_to_end(info);
    totalPrice+=info->GetPrice();
}
 
void Basket::PrintBasket()
{
    LinkedListIterator<Produkt*> listIterator(listProdukts);
 
    listIterator.Begin();
    do
    {
        cout << listIterator.GetCurrent()<<endl;
        listIterator.MoveNext();
 
    }while(!listIterator.IsFinish());
 
 
    cout<<endl<<"totalPrice="<<totalPrice<<endl;
}
 
int Basket::GetCountProdukts()
{
    listProdukts.GetCount();
}
Сейчас еще одна ошибочка появилась, как ее исправить, а то я замучался с этим проектом))
Миниатюры
Template argument required for class "LinkedListIterator"  
0
С чаем беда...
Эксперт CЭксперт С++
9432 / 4928 / 1348
Регистрация: 18.10.2014
Сообщений: 11,471
04.11.2014, 20:48 9
Лучший ответ Сообщение было отмечено raister32 как решение

Решение

Цитата Сообщение от raister32 Посмотреть сообщение
Сейчас еще одна ошибочка появилась
Ну если уж вы такие ошибки самостоятельно исправить не в состоянии, то я не знаю...

Конструктор вашего итератора требует указатель на список в качестве аргумента. Вы же туда пытаетесь пихать сам список.

Либо конструктор исправляйте, либо инициализацию на

C++
1
LinkedListIterator<Produkt*> listIterator(&listProdukts);
Видите это дополнительное '&'? Это во-первых.

Во-вторых, ваш список содержит значения типа 'Produkt*', как вы сами написали, т.е. указатели. Метод 'GetCurrent()' вашего итератора тоже будет возвращать указатели. Это значит что вот такой код

C++
1
cout << listIterator.GetCurrent() << endl;
тоже будет печатать на выход указатели, т.е. обычно шестнадцатеричные значения. Вы именно этого хотели?

P.S. В методе 'GetCountProdukts' пропущен 'return'...
1
6 / 6 / 6
Регистрация: 16.12.2013
Сообщений: 69
04.11.2014, 20:54  [ТС] 10
Еще раз спасибо, я просто еще не слишком силен в языке с++, но я стремлюсь к лучшему познанию. По поводу печати на выход указателей, пока что нужно так, позже это изменю
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2014, 20:54

базовый и производный класс, в базовом объявлена переменная "protected", она недоступна по имени в производном классе! template <class T> воду мутит!
Друзья! Вот код #include &lt;stdio.h&gt; template &lt;class T&gt; class otets { protected: int...

При компиляции ошибка: C2228: left of ".real",".imag" must have struct/class/union
Помогите, пожалуйста! Компилирую в VS2010... Ошибка: C2228: left of &quot;.real&quot;,&quot;.imag&quot; must have...

Исправить ошибку C2079 "MiniPlayer::music" использует неопределенный class "MiniMusic"
Приветствую. Ситуация следующая - есть 2 класса, оба используют друг друга. При компиляции вылезает...

Ошибка компиляции "no instance of constructor "MemReader::MemReader" matches the argument list"
Добрый день. При написании класса поиска определённого процесса столкнулся с ошибкой: &quot;E0289 no...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru