Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
1

Использование шаблонов при наследовании, ошибка при компиляции

28.10.2016, 21:41. Показов 1901. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
При изучении списков написал шаблон протестировал, все работает. После написал класс наследник от шаблона List.h, компилятор выдает ошибки. Помогите понять причину?
Шаблон списка.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef LISTNODE_H_
#define LISTNODE_H_
template <class NODETYPE> class List;
 
template <class NODETYPE>
class ListNode{
    friend class List<NODETYPE>;
public:
    ListNode(const NODETYPE &);
    NODETYPE getData()const;
private:
    NODETYPE data;
    ListNode <NODETYPE> *nextPtr;
};
 
template<class NODETYPE>
ListNode <NODETYPE>::ListNode(const NODETYPE & info): data(info), nextPtr(0){}
 
template <class NODETYPE>
NODETYPE ListNode <NODETYPE>::getData()const{return data;}
#endif /* LISTNODE_H_ */
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
#ifndef LIST_H_
#define LIST_H_
#include <iostream>
#include <cassert>
#include "ListNode.h"
 
using std::cout;
 
template<class NODETYPE>
class List{
public:
    List();
    ~List();
    void insertAtFront(const NODETYPE &);
    void insertAtBack(const NODETYPE &);
    bool removeFromFront(NODETYPE &);
    bool removeFromBack(NODETYPE &);
    bool isEmpty()const;
    void print()const;
private:
    ListNode <NODETYPE>* firstPtr;
    ListNode <NODETYPE>* lastPtr;
    ListNode <NODETYPE>* getNewNode(const NODETYPE &);
};
//конструктор
template <class NODETYPE>
List<NODETYPE>::List():firstPtr(0),lastPtr(0){}
//деструктор
template<class NODETYPE>
List<NODETYPE>::~List(){
    if(!isEmpty()){
        cout<<"удаление узлов....\n";
    }
    ListNode<NODETYPE> *currentPtr=firstPtr, *tempPtr;
    while(!currentPtr==0){
        tempPtr=currentPtr;
        cout<<currentPtr->data<<"\n";
        currentPtr=currentPtr->nextPtr;
        delete tempPtr;
    }
    cout<<"Все узлы удалены \n\n";
}
 
//вставить узел в начало списка
template <class NODETYPE>
void List<NODETYPE>::insertAtFront(const NODETYPE &value){
    ListNode<NODETYPE>* newPtr=getNewNode(value);
    if(isEmpty()){
        firstPtr=lastPtr=newPtr;
    }
    else{
    newPtr->nextPtr=firstPtr;
    firstPtr=newPtr;
    }
}
//вставить узел в конец списка
template <class NODETYPE>
void List<NODETYPE>::insertAtBack(const NODETYPE & value){
    ListNode<NODETYPE> *newPtr=getNewNode(value);
    if(isEmpty()){
        firstPtr=lastPtr=newPtr;
    }else
    {
        lastPtr->nextPtr=newPtr;
        lastPtr=newPtr;
    }
}
//удаление первого элемента
template<class NODETYPE>
bool List<NODETYPE>::removeFromFront(NODETYPE & value){
    if(isEmpty()){
        return false;
    }
    else{
        ListNode <NODETYPE> *tempPtr=firstPtr;
        if(firstPtr==lastPtr){
            firstPtr=lastPtr=0;
        }
        else{
            firstPtr=firstPtr->nextPtr;
        }
        value=tempPtr->data;
        delete tempPtr;
        return true;
    }
}
//удаление объекта с конца списка
template<class NODETYPE>
bool List<NODETYPE>::removeFromBack(NODETYPE & value){
 
    if(isEmpty()){
        return false;
    }
    else{
        ListNode<NODETYPE> *tempPtr=lastPtr;
        if(firstPtr==lastPtr){
            firstPtr=lastPtr=0;}
        else{
            ListNode<NODETYPE> *currentPtr=firstPtr;
            while(currentPtr->nextPtr!=lastPtr){
                currentPtr=currentPtr->nextPtr;}
                lastPtr=currentPtr;
                lastPtr->nextPtr=0;
            }
        value=tempPtr->data;
        delete tempPtr;
        return true;
    }
}
//создание нового обекта ListNode
template <class NODETYPE>
ListNode<NODETYPE>*List<NODETYPE>::getNewNode(const NODETYPE & value){
    ListNode<NODETYPE> *ptr=new ListNode<NODETYPE>(value);
    assert(ptr!=0);
    return ptr;
}
//проверка пуст ли список
template <class NODETYPE>
bool List<NODETYPE>::isEmpty()const{
    return firstPtr==0;
}
//печать списка
template<class NODETYPE>
void List<NODETYPE>::print()const{
    if(isEmpty()){cout<<"Список пуст \n"; return;}
 
    cout<<"Список элементов списка: \n";
    ListNode<NODETYPE>* tempPtr=firstPtr;
    while(tempPtr!=0){
        cout<<tempPtr->data<<" ";
        tempPtr=tempPtr->nextPtr;
        }
    cout<<"\n\n";
}
#endif /* LIST_H_ */
Шаблон стека.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef STACK_H_
#define STACK_H_
#include "List.h"
template <class STACKTYPE>
 
class Stack : public List<STACKTYPE>{
public:
    void push(const STACKTYPE &d){insertAtFront(d);}
    bool pop(STACKTYPE &d){return removeFromFront(d);}
    bool isStackEmpty()const{return isEmpty();}
    void printStack()const{print();}
};
#endif /* STACK_H_ */
Компилятор выдает следующие ошибки.
21:26:59 **** Incremental Build of configuration Debug for project Spisok ****
Info: Internal Builder is used for build
g++ -O0 -g3 -Wall -c -fmessage-length=0 -o "src\\StartStack.o" "..\\src\\StartStack.cpp"
In file included from ..\src\StartStack.cpp:8:0:
..\src\Stack.h: In member function 'bool Stack<STACKTYPE>::isStackEmpty() const':
..\src\Stack.h:17:42: error: there are no arguments to 'isEmpty' that depend on a template parameter, so a declaration of 'isEmpty' must be available [-fpermissive]
bool isStackEmpty()const{return isEmpty();}
^
..\src\Stack.h:17:42: note: (if you use '-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)
..\src\Stack.h: In member function 'void Stack<STACKTYPE>:rintStack() const':
..\src\Stack.h:18:31: error: there are no arguments to 'print' that depend on a template parameter, so a declaration of 'print' must be available [-fpermissive]
void printStack()const{print();}
^
..\src\Stack.h: In instantiation of 'void Stack<STACKTYPE>:ush(const STACKTYPE&) [with STACKTYPE = int]':
..\src\StartStack.cpp:15:18: required from here
..\src\Stack.h:15:45: error: 'insertAtFront' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
void push(const STACKTYPE &d){insertAtFront(d);}
~~~~~~~~~~~~~^~~
..\src\Stack.h:15:45: note: declarations in dependent base 'List<int>' are not found by unqualified lookup
..\src\Stack.h:15:45: note: use 'this->insertAtFront' instead
..\src\Stack.h: In instantiation of 'bool Stack<STACKTYPE>:op(STACKTYPE&) [with STACKTYPE = int]':
..\src\StartStack.cpp:19:26: required from here
..\src\Stack.h:16:47: error: 'removeFromFront' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
bool pop(STACKTYPE &d){return removeFromFront(d);}
~~~~~~~~~~~~~~~^~~
..\src\Stack.h:16:47: note: declarations in dependent base 'List<int>' are not found by unqualified lookup
..\src\Stack.h:16:47: note: use 'this->removeFromFront' instead
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.10.2016, 21:41
Ответы с готовыми решениями:

Ошибка компиляции при наследовании классов
У меня есть класс CNew который наследует класс CTransport но при компиляции выводит ошибку ниже 4...

Ошибки компиляции при наследовании и выводе размера класса
Здравствуйте, представленный ниже код должен в результате своей работы выводит размер классов...

Использование одинаковых имен при наследовании
Здравствуйте, имеется 2 класса: базисный MainStructure и дочерний Entity&lt;T&gt; Проблема в следующем:...

Ошибка при наследовании
Вот такой код: class Figure2 { protected: int Color; int CenterX; int CenterY; public:

6
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
28.10.2016, 21:47 2
Цитата Сообщение от Maximum_001 Посмотреть сообщение
Помогите понять причину?
Компилятор тебе пишет же что надо сделать
Цитата Сообщение от Maximum_001 Посмотреть сообщение
note: use 'this->removeFromFront' instead
Остальное по аналогии.
C++
1
2
3
4
    void push(const STACKTYPE &d){this->insertAtFront(d);}
    bool pop(STACKTYPE &d){return this->removeFromFront(d);}
    bool isStackEmpty()const{return this->isEmpty();}
    void printStack()const{ this->print();}
0
Эксперт С++
8971 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
28.10.2016, 21:51 3
Цитата Сообщение от Maximum_001 Посмотреть сообщение
Компилятор выдает следующие ошибки.
лекарство:
обратите внимание на использование ключевого слова this

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef STACK_H_
#define STACK_H_
#include "List.h"
template <class STACKTYPE>
 
class Stack : public List<STACKTYPE>{
public:
    void push(const STACKTYPE &d){ this->insertAtFront(d);}
    bool pop(STACKTYPE &d){return this->removeFromFront(d);}
    bool isStackEmpty()const{return this->isEmpty();}
    void printStack()const{ this->print();}
};
#endif /* STACK_H_ */
0
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
28.10.2016, 22:06  [ТС] 4
Спасибо за ответ, но почему тогда в учебнике этого нет? пример взят из учебника.

Добавлено через 2 минуты
Все заработало, не понятно почему пример из учебника не работает.
0
Эксперт С++
8971 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
28.10.2016, 22:10 5
Цитата Сообщение от Maximum_001 Посмотреть сообщение
не понятно почему пример из учебника не работает.
C++, для чего служит указатель "this->"?
Почему компилируется не объявленная переменная в шаблоне?
Почему компилируется не объявленная переменная в шаблоне?
0
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
28.10.2016, 22:32  [ТС] 6
Спасибо большое, я может не доконца понял всех тонкостей компиляции, буду учится, теперь непонятно почпму в учебнике это не предусмотренно, но это уже не по теме.
0
Эксперт С++
8482 / 6149 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.10.2016, 22:49 7
C++
1
template <class NODETYPE> class List;
Плохое именование, не используйте верхний регистр (NODETYPE) в именование (если только это не макрос)
0
28.10.2016, 22:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.10.2016, 22:49
Помогаю со студенческими работами здесь

Ошибка при наследовании
Помогите разобраться в следующем: Есть 2 класса Flight и Route, которые реализуют интерфейс...

Ошибка при наследовании
Подскажите пожалуйста почему наследование класса readwrite не работает? //Программа считывает...

Ошибка при наследовании
Имеется архитектура вида: класс &quot;человек&quot;, от него производные &quot;препод&quot; и &quot;член приемной комиссии&quot;....

Ошибка при наследовании
Здраствуйте,не могу понять где именно оштбся,возможно кто-то поможет,код прилагаю //#include...

Ошибка при наследовании
Привет! Ни как не могу разобраться, в чём дело. Создал 2 класса: Base и Derived, где Derived...

Ошибка при наследовании?
Программа компилируется, но консоль не выдает информацию. Связано ли это как то с переполнением...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru