Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
MAnton
 Аватар для MAnton
23 / 23 / 1
Регистрация: 21.04.2011
Сообщений: 139
#1

Класс шаблон и методы класса - C++

11.07.2012, 19:13. Просмотров 982. Ответов 1
Метки нет (Все метки)

Есть такой класс-список прямо из учебника павловской:
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <class Data> class List{
    class Node{
        Data d;
        Node *next;
        Node(Data dat=0){d=dat,next=0;}
    };
    Node *pbeg, *pend;
    List(){pbeg=0,pend=0;}
    ~List();
    void add(Data d);
    Node * find(Data d);
};
и функция find
C++
1
2
3
4
5
6
7
8
template <class Data> Node* List<Data>::find(Data d){
    Node *pv=pbeg;
    while (pv){
        if(pv->d==d)break;
        pv=pv->next;
    }
    return pv;
}
в этом месте компилятор начинает ругаться, ему не нравиться тип возвращаемого значения.
Вывод
1>c:\users\anton\documents\visual studio 2010\projects\program\program\program.cpp(35): error C2143: синтаксическая ошибка: отсутствие ";" перед "*"
1>c:\users\anton\documents\visual studio 2010\projects\program\program\program.cpp(35): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>c:\users\anton\documents\visual studio 2010\projects\program\program\program.cpp(35): error C2065: Data: необъявленный идентификатор
1>c:\users\anton\documents\visual studio 2010\projects\program\program\program.cpp(35): error C2065: Data: необъявленный идентификатор
1>c:\users\anton\documents\visual studio 2010\projects\program\program\program.cpp(35): error C2146: синтаксическая ошибка: отсутствие ")" перед идентификатором "d"
1>c:\users\anton\documents\visual studio 2010\projects\program\program\program.cpp(35): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>c:\users\anton\documents\visual studio 2010\projects\program\program\program.cpp(35): error C2470: List<Data>::find: выглядит как определение функции, но без списка параметров; пропускается вероятное тело функции
1>c:\users\anton\documents\visual studio 2010\projects\program\program\program.cpp(35): error C2072: List<Data>::find: инициализация функции
1>c:\users\anton\documents\visual studio 2010\projects\program\program\program.cpp(35): error C2059: синтаксическая ошибка: )
1>c:\users\anton\documents\visual studio 2010\projects\program\program\program.cpp(44): error C2143: синтаксическая ошибка: отсутствие ";" перед "{"
1>c:\users\anton\documents\visual studio 2010\projects\program\program\program.cpp(44): error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа)
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========



Возможно компилятор не понимает тип возвращаемого значения, но вопрос почему?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2012, 19:13     Класс шаблон и методы класса
Посмотрите здесь:

Методы класса C++
C++ Из класса в класс-шаблон
Шаблон класса (параметризация класса) C++
C++ методы класса
C++ шаблон класса
C++ Консоль, класс, методы класса: БД и файл?
C++ Создать шаблон некоторого класса, возможно, реализованного с применением некоторого серверного класса
Класс - ученик средней школы, шаблон класса C++
Шаблон функции для использования с классами, имеющими разные методы C++
C++ Переделать класс на шаблон класса
C++ Методы класса внутри определения класса
C++ Вынести класс и методы класса в отдельные файлы

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ma3a
Эксперт C++
613 / 457 / 31
Регистрация: 28.01.2011
Сообщений: 605
11.07.2012, 19:39     Класс шаблон и методы класса #2
MAnton, Вы определяете функцию find вне тела самого класса List<Data>, а класс Node у вас находится внутри него, зависит от внешней по отношению к нему области видимости класса List<Data>. Поэтому компилятор и не видит этот Node. Для этого стоит указать явно, что он определён в List<Data>:
C++
1
List<Data>::Node
Более того, поскольку класс List<Data> является шаблонным, компилятору надобно ещё указать ключевое слово typename перед List<Data>::Node, это подсказка компилятору, потому что он в этом месте не знает, что Вы определяете, вложенный тип Node, или же, например, переменную внутри класса. А не знает он этого, потому что в общем случае Вы можете указать специализацию этого шаблона для какого-то конкретного типа, где этого Node не будет и в помине, либо он будет представлять собой нечто иное. Поэтому сигнатуру функции в этом определении нужно записать так:
C++
1
template<class Data> typename List<Data>::Node * List<Data>::find(Data d)
Yandex
Объявления
11.07.2012, 19:39     Класс шаблон и методы класса
Ответ Создать тему
Опции темы

Текущее время: 13:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru