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

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

Войти
Регистрация
Восстановить пароль
 
HenryDukart
 Аватар для HenryDukart
122 / 122 / 35
Регистрация: 05.10.2013
Сообщений: 455
Завершенные тесты: 2
#1

Структура в шаблоне класса - C++

29.03.2014, 21:35. Просмотров 285. Ответов 3
Метки нет (Все метки)

Есть у меня класс бинарного поискового дерева. В нем описана структура TreeNode элемента дерева.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <typename T= int>
class Tree
{
private:
    struct TreeNode
    {
        T info;
        TreeNode *left, *right;
        TreeNode()
        {right=left=NULL;}
    };
    TreeNode *root;
    TreeNode* Clone (TreeNode*);
        .....
public:
        .....
};
Компилятор выдает ошибки на заголовке реализации метода Clone
C++
1
2
3
4
5
template <typename T>
TreeNode* Tree <T>::Clone(TreeNode*s)
{
   ....
}
Выдаёт ошибки:
error C2143: синтаксическая ошибка: отсутствие ";" перед "*"
error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
error C2065: T: необъявленный идентификатор

Помогите, пожалуйста, решить проблему.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2014, 21:35     Структура в шаблоне класса
Посмотрите здесь:

C++ Как описывать функции, заданные в шаблоне класса, тип возвращаемого значения которых совпадает с именем класса
C++ Перегрузка операторов в шаблоне класса
Как потоковую функцию в шаблоне класса сделать неинлайновой C++
Вызов функции в шаблоне класса C++
C++ Не типовые параметры в шаблоне класса
C++ Структура класса
C++ Перегрузка << в шаблоне класса List
Ошибка в шаблоне класса (вывод в поток) C++
C++ Перегрузка операций ввода/вывода в шаблоне класса
Перегрузка оператора умножения в шаблоне класса вектора (Visual Studio 2013) C++
C++ Перегрузка оператора = в шаблоне класса
C++ Error C4519: аргументы шаблона по умолчанию можно использовать только в шаблоне класса

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
29.03.2014, 22:24     Структура в шаблоне класса #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
HenryDukart, вот так
C++
1
2
3
4
5
template <typename T>
typename Tree<T>::TreeNode* Tree <T>::Clone(TreeNode*s)
{
......
}
HenryDukart
 Аватар для HenryDukart
122 / 122 / 35
Регистрация: 05.10.2013
Сообщений: 455
Завершенные тесты: 2
29.03.2014, 22:38  [ТС]     Структура в шаблоне класса #3
Спасибо большое, помогло. Как такая конструкция называется?
DrOffset
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
29.03.2014, 22:49     Структура в шаблоне класса #4
HenryDukart, тут две конструкции:
1) При определении возвращаемого значения функции класса не учитывается scope этого класса для поиска имен. Поэтому структура определенная внутри не видна.
Вот пример без шаблона:
C++
1
2
3
Tree::TreeNode * Tree::Clone(TreeNode*s) // нужно явно указать что TreeNode принадлежит Tree
{
}
Когда же мы определяем параметр, то scope класса включается в поиск имен и все проходит нормально. Хотя никто не запретит написать так:
C++
1
2
3
Tree::TreeNode * Tree::Clone(Tree::TreeNode*s)
{
}
И это тоже будет правильно.
2) Теперь к шаблонам. Имя TreeNode в нашем контексте является так называемым зависимым именем. То есть чем является нечто под названием TreeNode зависит от параметра T (еще бы, мы же определили ее внутри шаблона). При разрешении зависимых имен нет возможности узнать является ли имя типом или чем-то другим. Для того, чтобы подсказать компилятору, что TreeNode - это именно тип (а не константа или функция), используется ключевое слово typename.
Yandex
Объявления
29.03.2014, 22:49     Структура в шаблоне класса
Ответ Создать тему
Опции темы

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