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

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

Восстановить пароль Регистрация
 
MAnton
 Аватар для MAnton
23 / 23 / 1
Регистрация: 21.04.2011
Сообщений: 139
11.07.2012, 19:13     Класс шаблон и методы класса #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++ Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени?
C++ из класса в класс-шаблон
C++ Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get (…), show (…). Определить другие методы
C++ Создать класс Triad (тройка чисел) - определить методы; определить производный класс Date - переопределить методы
C++ консоль, класс, методы класса: БД и файл?
Класс - ученик средней школы, шаблон класса C++
Шаблоны функций, Ошибка: для использования класса шаблон требуется список аргументов шаблон C++
C++ Переделать класс на шаблон класса

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ma3a
Эксперт C++
612 / 456 / 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     Класс шаблон и методы класса
Ответ Создать тему
Опции темы

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