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

Функция указатель на класс, определенный внутри шаблонного класса - C++

Восстановить пароль Регистрация
 
Lefff
0 / 0 / 0
Регистрация: 06.05.2011
Сообщений: 10
02.10.2013, 10:37     Функция указатель на класс, определенный внутри шаблонного класса #1
Доброго времени суток! Помогите пожалуйста разобрать со следующим кодом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template <class T> class List{ 
    class Node{ 
    public:
             T d;
             Node(T d){/..../};
    //тело ф-ции.
};
    Node *pbeg, *pend; 
public: 
    //конструкторы деструкторы и др. ф-ции. 
    Node* find(T); 
    Node* insert(T, T); 
};
//функция 1
template <class T> Node* List<T>::find(T d)
{ 
    //тело ф-ции. 
} 
//функция 2
template <class T> Node* List <T>::insert(T key, T d){ 
    //тело ф-ции.
}
Программу пишу в MSVS 2010, и при компиляции VS ругается на 1 и 2 функции, но если сделать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Node{ 
    public:
             //T d;
             int d;
            // Node(T d){/..../};
            Node(int d){/..../};
    //тело ф-ции.
};
template <class T> class List{ 
    Node *pbeg, *pend; 
public: 
    //конструкторы деструкторы и др. ф-ции. 
    Node* find(T); 
    Node* insert(T, T); 
};
//функция 1
template <class T> Node* List<T>::find(T d)
{ 
    //тело ф-ции. 
} 
//функция 2
template <class T> Node* List <T>::insert(T key, T d){ 
    //тело ф-ции.
}
то все работает. Но а мне надо чтобы в классе Node переменная d была "произвольного" типа, а не конкретно типа int.

Добавлено через 23 минуты
Цитата Сообщение от Lefff Посмотреть сообщение
Но а мне надо чтобы в классе Node переменная d была "произвольного" типа, а не конкретно типа int.
Точнее, чтобы переменная d была того же типа, который передастся в класс List
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.10.2013, 10:37     Функция указатель на класс, определенный внутри шаблонного класса
Посмотрите здесь:

C++ указатель на экземпляр шаблонного класса
C++ Функция-член шаблонного класса
C++ Как прописать шаблонную функцию внутри шаблонного класса?
C++ Указатель на экземпляр шаблонного класса
Не создается указатель на класс внутри класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
02.10.2013, 10:43     Функция указатель на класс, определенный внутри шаблонного класса #2
пардон, сглючил.
HedgehogLu
 Аватар для HedgehogLu
146 / 67 / 1
Регистрация: 04.09.2013
Сообщений: 250
02.10.2013, 10:46     Функция указатель на класс, определенный внутри шаблонного класса #3
Странно по идее класс Node должен быть виден только внутри класса List. И соответственно за пределами класса List с ним работать невозможно. Я бы сделал так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template <class T> class Node{ 
    public:
             T d;
             Node(T d){ /*........*/};
};
 
template <class T> class List{ 
    
    Node<T> *pbeg, *pend; 
public: 
    Node<T>* find(T); 
    Node<T>* insert(T, T); 
};
template <class T> Node<T>* List<T>::find(T d)
{ 
} 
 
template <class T> Node<T>* List <T>::insert(T key, T d)
{ 
}
Lefff
0 / 0 / 0
Регистрация: 06.05.2011
Сообщений: 10
02.10.2013, 10:48  [ТС]     Функция указатель на класс, определенный внутри шаблонного класса #4
Если я правильно понял шаблоны, то шаблон существует до конца его определения, т.е. мне надо будет передавать дважды тип или я не правильно понял?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
02.10.2013, 10:50     Функция указатель на класс, определенный внутри шаблонного класса #5
вот такой попробуйте. 12 студия компилит:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
template <class T>
class List
{ 
  class Node
  { 
  public:
    T d;
    Node(T dd)
      : d(dd)
    {
    }
  };
  
  Node* pbeg;
  Node* pend;
 
public: 
    Node* find(T) const;
    Node* insert(T, T); 
};
 
template <class T>
typename List<T>::Node* List<T>::find(T d) const
{ 
  return 0;
} 
 
template <class T>
typename List<T>::Node* List<T>::insert(T key, T d)
{ 
}
 
class Test
{
};
 
int main()
{
  Test test1;
  Test test2;
  List<Test> testsList;
  testsList.find(test1);
  testsList.insert(test1, test2);
  return 0;
}
И да, как уже сказали, вложенный класс Node должен быть или публичным или внешним. Лучше внешним, мало ли в какой еще структуре его можно будет заиспользовать.
Lefff
0 / 0 / 0
Регистрация: 06.05.2011
Сообщений: 10
02.10.2013, 10:58  [ТС]     Функция указатель на класс, определенный внутри шаблонного класса #6
Большое спасибо DU и HedgehogLu работаю оба кода=)
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
02.10.2013, 11:05     Функция указатель на класс, определенный внутри шаблонного класса #7
у вас узлы кстати неправильные. правильные узлы содержат значение и пару указателей на предыдущий и следующий. со своими узлами непонятно как вы собираетесь бегать по списку. правильный узел:
C++
1
2
3
4
5
6
7
8
9
template <class T> 
struct Node
{ 
  T value;
  Node* next;
  Node* prev;
 
  // тут всякие конструкторы.
};
Lefff
0 / 0 / 0
Регистрация: 06.05.2011
Сообщений: 10
02.10.2013, 11:08  [ТС]     Функция указатель на класс, определенный внутри шаблонного класса #8
Цитата Сообщение от DU Посмотреть сообщение
Node* find(T) const;
А для чего const?
Цитата Сообщение от DU Посмотреть сообщение
template <class T>
typename List<T>::Node* List<T>::find(T d) const
typename List<T> - это чтобы компилятор знал где объявлена :Node* find(T d) const ?

Добавлено через 2 минуты
Цитата Сообщение от DU Посмотреть сообщение
у вас узлы кстати неправильные. правильные узлы содержат значение и пару указателей на предыдущий и следующий. со своими узлами непонятно как вы собираетесь бегать по списку. правильный узел:
C++
1
2
3
4
5
6
7
8
9
template <class T> 
struct Node
{ 
  T value;
  Node* next;
  Node* prev;
 
  // тут всякие конструкторы.
};
Узлы у меня есть, просто для того чтобы показать конкретно ошибку я их убрал.
Вот мой класс Node
C++
1
2
3
4
5
6
7
8
9
10
class Node{ 
    public: 
        T d;
        Node *next;
        Node *prev; 
        Node(T dat = 0){
            d = dat; 
            next = 0; 
            prev = 0;
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.10.2013, 11:10     Функция указатель на класс, определенный внутри шаблонного класса
Еще ссылки по теме:

Шаблонный класс от шаблонного класса, ругается компоновщик C++
Друзья шаблонного класса. Использование вложенной в класс структуры C++
Итератор внутри шаблонного класса C++

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

Или воспользуйтесь поиском по форуму:
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
02.10.2013, 11:10     Функция указатель на класс, определенный внутри шаблонного класса #9
typename связано с зависимостью имен внутри шаблонов от параметров шаблонов.
тут есть немного инфы: http://alenacpp.blogspot.ru/2006/08/typename.html

зачем нужны константные функции - смотрите в учебниках.
правильнее наверно было бы две фукнции заиметь:
const Node* find(T) const;
Node* find(T);
Yandex
Объявления
02.10.2013, 11:10     Функция указатель на класс, определенный внутри шаблонного класса
Ответ Создать тему
Опции темы

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