Консультация № 183397
29.05.2011, 13:54
48.89 руб.
29.05.2011, 13:56
0 32 2
Здравствуйте! Прошу помощи в следующем вопросе:

Дошёл я в изучении С++ до шаблонов. Вот архив программы
Проблема одна, но их много. Компилятор выдаёт вот такие сообщения:
mylist.h:34:25: error: expected type-specifier before 'Node'

Вопрос: чтобы это значило? И как правильно задавать типы при использовании шаблонов, когда в качестве ячейки данных в классе у меня используется указатель на структуру?

Обсуждение

давно
Профессор
230118
3054
29.05.2011, 14:53
общий
это ответ
Здравствуйте, sir Henry!

Так как оператор вывода является friend-ом, он не является частью класса и не "видит", что собой представляет класс T. Следовательно, его тоже нужно объявить как шаблон.
Код:
 template <class T> friend istream &operator >> (istream &input, MyList &mylist)
давно
Профессор
230118
3054
29.05.2011, 14:56
общий
Адресаты:
Там #include "mylist.h".
Скачали не тот архив?
Неизвестный
29.05.2011, 15:18
общий
Адресаты:
Структуру Node лучше объявить в приватной части класса MyList, а оператор >> надо реализовать через метод Add. Тогда всё станет значительно проще
давно
Академик
320937
2216
29.05.2011, 15:50
общий
Адресаты:
Да, не туда посмотрел, спасибо.
давно
Мастер-Эксперт
425
4118
29.05.2011, 15:59
общий
Цитата: 321399
Структуру Node лучше объявить в приватной части класса MyList

Ага, хорошее замечание. Сейчас попробую.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
425
4118
29.05.2011, 16:06
общий
Адресаты:
Что-то по Вашему ответу не получается сделать. Пишет такую ошибку:
error: declaration of 'class T'
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
29.05.2011, 16:11
общий
29.05.2011, 16:12
Адресаты:
Ответ абсолютно не объясняет суть проблемы.

А суть вопроса в том, что, поскольку используются шаблоны, обязательно указывать тип шаблона.
Т.е. писать не так
Код:
    Node<T> *node = new Node();

а так
Код:
    Node<T> *node = new Node<T>();


не правильно
Код:
    node = new (Node);

правильно
Код:
    node = new (Node<T>);


не правильно
Код:
  List1 = new MyList;
List2 = new MyList;
List3 = new MyList;

правильно
Код:
  List1 = new MyList<float>;
List2 = new MyList<float>;
List3 = new MyList<float>;
Неизвестный
29.05.2011, 16:14
общий
это ответ
Здравствуйте, sir Henry!
Суть проблемы в том, что, поскольку используются шаблоны, обязательно указывать тип шаблона.
Т.е. писать не так
Код:

Node<T> *node = new Node();

а так
Код:

Node<T> *node = new Node<T>();


не правильно
Код:

node = new (Node);

правильно
Код:

node = new (Node<T>);


не правильно
Код:

List1 = new MyList;
List2 = new MyList;
List3 = new MyList;

правильно
Код:

List1 = new MyList<float>;
List2 = new MyList<float>;
List3 = new MyList<float>;
5
Всё просто супер!!
давно
Мастер-Эксперт
425
4118
29.05.2011, 16:20
общий
Как всегда, Ваш совет в самую точку.
Что интересно, в книжке по С++ было написано немного не так.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
425
4118
29.05.2011, 16:21
общий
Ваш совет по объявлению структуры программу упростил. Спасибо.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Профессор
230118
3054
29.05.2011, 16:22
общий
Адресаты:
В каком месте?
давно
Профессор
230118
3054
29.05.2011, 16:22
общий
Адресаты:
Node<T> *node = new Node<T>();
давно
Мастер-Эксперт
425
4118
29.05.2011, 16:27
общий
29.05.2011, 16:44
Цитата: Асмик Гаряка
В каком месте?

Вы про ошибку? Ошибка ругается как раз на тот вариант заголовка функции, которую Вы мне привели в ответе.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Профессор
230118
3054
29.05.2011, 16:30
общий
VS компилирует
Неизвестный
29.05.2011, 16:37
общий
29.05.2011, 16:40
VС++ некоторые вещи "додумывает" за программиста. Это сильно расслабляет и ухудшает совместимость кода между различными компиляторами.

И все же странно как он может компилировать такое?
Код:
List1 = new MyList;


Не верю.
Ну и вообще странно голосовать против правильного ответа. Разве только в отместку. Ну это внутренняя проблема. Не моя.
давно
Профессор
230118
3054
29.05.2011, 16:40
общий
Эти места, разумеется, тоже пришлось исправить.
List1 = new MyList<float>();
List2 = new MyList<float>();
List3 = new MyList<float>();
давно
Мастер-Эксперт
425
4118
29.05.2011, 16:42
общий
Адресаты:
Цитата: Асмик Гаряка
VS компилирует

Возможно. Я компилирую G++. Он несколько более строг к синтаксису.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Академик
320937
2216
29.05.2011, 16:50
общий
Адресаты:
Sir Henry! Вы можете поделиться остальными лабораторками?
давно
Мастер-Эксперт
425
4118
29.05.2011, 16:52
общий
Адресаты:
Могу. Вам только тексты программ нужны?
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Профессор
230118
3054
29.05.2011, 16:54
общий
Адресаты:
Неизвестно, кто строже, так как без изменения этой строки компилятор выдает ошибку на первую же строчку функции T f;
давно
Академик
320937
2216
29.05.2011, 16:55
общий
Адресаты:
Нет, не только. Что не жалко. Обычно бывают еще какие-то описания и задания. Буду очень признателен.
давно
Мастер-Эксперт
425
4118
29.05.2011, 17:02
общий
Адресаты:
Цитата: Асмик Гаряка
Неизвестно, кто строже, так как без изменения этой строки компилятор выдает ошибку на первую же строчку функции T f;

Спорить не буду. Только хочу сказать, что когда я объявление структуры внёс внутрь класса, то у меня заработал тот вариант функции, который был на момент задавания вопроса.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
425
4118
29.05.2011, 17:05
общий
Адресаты:
Хорошо, выложу. Но с условием. Вы поклянётесь своей треуголкой, что материал, который я Вам выложу, не будет в этом учебном году использоваться на территории сибирского федерального округа. Как-то не хочется выглядеть плагиатором...
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Академик
320937
2216
29.05.2011, 17:07
общий
После того, как внес изменения, согласно ответу Micren'a, программа отработала. Code::Blocks/G++
Есть, конечно, еще Варнинги, но в вопросе их не было.
Код:
F:\p1\lab1204_file.cpp||In function 'int main()':|
F:\p1\lab1204_file.cpp|15|warning: unused variable 'i'|
F:\p1\lab1204_file.cpp|16|warning: unused variable 'f'|
F:\p1\mylist.h||In member function 'void MyList<T>::Print() [with T = float]':|
F:\p1\lab1204_file.cpp|33|instantiated from here|
F:\p1\mylist.h|265|warning: comparison between signed and unsigned integer expressions|
F:\p1\mylist.h||In member function 'void MyList<T>::Sort() [with T = float]':|
F:\p1\lab1204_file.cpp|43|instantiated from here|
F:\p1\mylist.h|230|warning: comparison between signed and unsigned integer expressions|
F:\p1\mylist.h|233|warning: comparison between signed and unsigned integer expressions|
F:\p1\mylist.h||In member function 'void MyList<T>::Append(MyList<T>*) [with T = float]':|
F:\p1\lab1204_file.cpp|60|instantiated from here|
F:\p1\mylist.h|215|warning: comparison between signed and unsigned integer expressions|
F:\p1\mylist.h||In destructor 'MyList<T>::~MyList() [with T = float]':|
F:\p1\lab1204_file.cpp|73|instantiated from here|
F:\p1\mylist.h|86|warning: comparison between signed and unsigned integer expressions|
F:\p1\mylist.h||In member function 'T MyList<T>::Get(unsigned int) [with T = float]':|
F:\p1\mylist.h|217|instantiated from 'void MyList<T>::Append(MyList<T>*) [with T = float]'|
F:\p1\lab1204_file.cpp|60|instantiated from here|
F:\p1\mylist.h|139|warning: comparison between signed and unsigned integer expressions|
F:\p1\mylist.h|123|warning: unused variable 'f'|
||=== Build finished: 0 errors, 9 warnings ===|

Раз программа работает, ответ считаю правильным.
давно
Академик
320937
2216
29.05.2011, 17:08
общий
29.05.2011, 17:09
Адресаты:
Клянусь. Если Вы только Ковров к Сибири не присоедините случайно. Причем, "в лоб" я в любом случае использовать не буду ничего, только для поддержания формы. Спасибо.
давно
Мастер-Эксперт
425
4118
29.05.2011, 17:34
общий
Адресаты:
Завтра выложу.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
425
4118
29.05.2011, 17:37
общий
Адресаты:
Цитата: lamed
После того, как внес изменения, согласно ответу Micren'a, программа отработала.

Вот в том то и дело, что именно согласно ответа Micren'а. Если взять только ответ Асмик, то программа как была нерабочая, так и осталась.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
425
4118
30.05.2011, 12:18
общий
Адресаты:
Вот, держите.
Прикрепленные файлы:
b740b1c82babeef10c196324ffcdc321.zip
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Академик
320937
2216
30.05.2011, 12:57
общий
Адресаты:
Спасибо большое. Смотрю.
давно
Мастер-Эксперт
425
4118
30.05.2011, 13:32
общий
Адресаты:
Искренне надеюсь, что не сильно опозорюсь в Ваших глазах.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Форма ответа