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

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

Восстановить пароль Регистрация
 
HenryDukart
 Аватар для HenryDukart
99 / 99 / 27
Регистрация: 05.10.2013
Сообщений: 400
Завершенные тесты: 2
29.03.2014, 21:35     Структура в шаблоне класса #1
Есть у меня класс бинарного поискового дерева. В нем описана структура 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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,592
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
99 / 99 / 27
Регистрация: 05.10.2013
Сообщений: 400
Завершенные тесты: 2
29.03.2014, 22:38  [ТС]     Структура в шаблоне класса #3
Спасибо большое, помогло. Как такая конструкция называется?
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,592
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     Структура в шаблоне класса
Ответ Создать тему
Опции темы

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