Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Maximum_001
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
#1

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

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

При изучении списков написал шаблон протестировал, все работает. После написал класс наследник от шаблона 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2016, 21:41
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Использование шаблонов при наследовании, ошибка при компиляции (C++):

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

Ошибка при наследовании - C++
Здраствуйте,не могу понять где именно оштбся,возможно кто-то поможет,код прилагаю //#include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

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

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

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

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

6
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
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
hoggy
6862 / 3069 / 525
Регистрация: 15.11.2014
Сообщений: 6,976
Завершенные тесты: 1
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
Maximum_001
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
28.10.2016, 22:06  [ТС] #4
Спасибо за ответ, но почему тогда в учебнике этого нет? пример взят из учебника.

Добавлено через 2 минуты
Все заработало, не понятно почему пример из учебника не работает.
0
hoggy
6862 / 3069 / 525
Регистрация: 15.11.2014
Сообщений: 6,976
Завершенные тесты: 1
28.10.2016, 22:10 #5
Цитата Сообщение от Maximum_001 Посмотреть сообщение
не понятно почему пример из учебника не работает.
C++, для чего служит указатель "this->"?
Почему компилируется не объявленная переменная в шаблоне?
Почему компилируется не объявленная переменная в шаблоне?
0
Maximum_001
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
28.10.2016, 22:32  [ТС] #6
Спасибо большое, я может не доконца понял всех тонкостей компиляции, буду учится, теперь непонятно почпму в учебнике это не предусмотренно, но это уже не по теме.
0
Avazart
Эксперт С++
7586 / 5571 / 330
Регистрация: 10.12.2010
Сообщений: 24,996
Записей в блоге: 17
28.10.2016, 22:49 #7
C++
1
template <class NODETYPE> class List;
Плохое именование, не используйте верхний регистр (NODETYPE) в именование (если только это не макрос)
0
28.10.2016, 22:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2016, 22:49
Привет! Вот еще темы с ответами:

Ошибка при наследовании класса - C++
Всем доброго времени суток, пытаюсь отнаследовать класс, вот такой код я смастерил: #ifndef CLASS_H_ #define CLASS_H_ class stack ...

Ошибка multiple definition of main при наследовании - C++
Всем привет. Проблема описана много где в интернете , но я так и не смог понять в чём косяк у меня. Помогите разобраться. Есть...

Ошибка: undefined reference to при наследовании класса - C++
Здравствуйте форумчане. Пытаюсь наследовать класс MyService от OAuthService и получаю множество ошибок: Ошибка: undefined reference to...

Ошибка памяти. Передача массива при наследовании - C++
#include&lt;iostream&gt; using namespace std; class map { protected: char **my_map; public: map(){} map(char **maps) {


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru