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

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

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

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

29.03.2014, 21:35. Просмотров 304. Ответов 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: необъявленный идентификатор

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

Как описывать функции, заданные в шаблоне класса, тип возвращаемого значения которых совпадает с именем класса - C++
Здравствуйте. А как описывать функции, заданные в шаблоне класса, тип возвращаемого значения которых совпадает с именем класса? Более...

Перегрузка операторов в шаблоне класса - C++
#include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;typeinfo&gt; #include &lt;windows.h&gt; using namespace std; template &lt;class Type1,...

Не типовые параметры в шаблоне класса - C++
Начал изучать шаблоны и вроде все было хорошо, но в задании с использованием в шаблоне не типового параметра встал... вот что получилось......

Перегрузка << в шаблоне класса List - C++
Сап. Написал класс, реализующий работу односвязного списка. Для вывода решил использовать перегрузку &lt;&lt; , но тут и начались проблемы (код...

Перегрузка оператора = в шаблоне класса - C++
Доброго дня! Возник такой вот вопрос: я сделал шаблон класса и пытаюсь перегрузить его оператор присваивания, в итоге получается...

Вызов функции в шаблоне класса - C++
Выполняю,через шаблоны класса. Вообщем,в меню не могу вызвать функции. Скажите,все ли правильно в вызове функций? вот файл .h ...

3
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
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)
{
......
}
0
HenryDukart
123 / 123 / 35
Регистрация: 05.10.2013
Сообщений: 457
Завершенные тесты: 2
29.03.2014, 22:38  [ТС] #3
Спасибо большое, помогло. Как такая конструкция называется?
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
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.
1
29.03.2014, 22:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2014, 22:49
Привет! Вот еще темы с ответами:

Ошибка в шаблоне класса (вывод в поток) - C++
Помогите пожалуйста понять что не так: // list.h template&lt;class K, class V&gt; class List { public: ... template...

Перегрузка операций ввода/вывода в шаблоне класса - C++
template &lt;typename T&gt; class Vector { private: T * data; int size; public: Vector(int); friend std::istream &amp;...

Как потоковую функцию в шаблоне класса сделать неинлайновой - C++
Если потоковую функцию описать внутри класса, то все компилируется и собирается. Но если вынести ее код наружу, то функция не...

Перегрузка оператора умножения в шаблоне класса вектора (Visual Studio 2013) - C++
Здравствуйте! Пишу шаблон класса векторов и хочу реализовать в нем перегрузку оператора умножения на число. Сложение, вычитание,...


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

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

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