Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не разберусь с шаблонами, Ошибка линкера 
V
    Опции темы
PirateTigo
Дата 11.8.2008, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 4.8.2008

Репутация: нет
Всего: нет



В общем у меня есть шаблон класса, в котором определена функция Save:
Код

template <class T>
class List {
    int N;                            //Number of elements
    Elem<T> *Head;                    //Head of list
public:
//Constructors
    List(void);
    List(T&);

//Methods
    void AddElem (T&, int);            //Additional Elem to List by logical number
    void DelElem (int);                //Delete Elem by logical number
    int Max (int);                    //Search maximum of elements
    int Min (int);                    //Search minimum of elements
    void Sort (void);                //Sorting insets
    Elem<T> *Get (int);                //Get point to Elem by set number
    BOOL Save (char *);                //Save list into the set file

//Operations for work with streams
    friend std::istream &operator>><>(std::istream &,List<T> &);
    
};


Ее реализация лежит в том же файле:
Код

BOOL List<NumString>::Save(char *s)
{
    ...
}


При линковке происходит ошика: 
Код

error LNK2019: unresolved external symbol "class std::basic_istream<char,struct std::char_traits<char> > & __cdecl >>(class std::basic_istream<char,struct std::char_traits<char> > &,class List<class NumString> &)" (?>>@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AAV12@AAV?$List@VNumString@@@@@Z) referenced in function _main


Подскажите, пожалуйста, что я сделал не так? Заранее благодарен
PM MAIL ICQ Skype   Вверх
Alek86
Дата 11.8.2008, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



написано, что не реализован  оператор >>


--------------------
user posted image    user posted image
PM MAIL   Вверх
PirateTigo
Дата 11.8.2008, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 4.8.2008

Репутация: нет
Всего: нет



В том то и дело, что он реализован! И когда я комменчу определение и реализацию функции Save, то все линкуется на ура..  smile 
PM MAIL ICQ Skype   Вверх
mes
Дата 11.8.2008, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(PirateTigo @  11.8.2008,  11:15 Найти цитируемый пост)
В том то и дело, что он реализован! 

можно код? 


--------------------
PM MAIL WWW   Вверх
PirateTigo
Дата 11.8.2008, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 4.8.2008

Репутация: нет
Всего: нет



Код

можно код?


Пожалуйста:

[/code]
Код

template <class T>
std::istream &operator>>(std::istream& IO, List<T> &Spisok)
{//IO - input stream, Spisok - List of objects
    T Obj;
    IO >> Obj;
    Spisok.AddElem(Obj,0);
    return IO;
}



Это сообщение отредактировал(а) PirateTigo - 11.8.2008, 11:24
PM MAIL ICQ Skype   Вверх
mes
Дата 11.8.2008, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(PirateTigo @  11.8.2008,  11:23 Найти цитируемый пост)
Пожалуйста:

надеюсь она тоже в хидере ?


--------------------
PM MAIL WWW   Вверх
Alek86
Дата 11.8.2008, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Код
operator>><>

что тут <> означает?


--------------------
user posted image    user posted image
PM MAIL   Вверх
PirateTigo
Дата 11.8.2008, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 4.8.2008

Репутация: нет
Всего: нет



Цитата(mes @ 11.8.2008,  12:24)
надеюсь она тоже в хидере ?

Весь код лежит в одном файле "List.h"

Добавлено через 2 минуты и 28 секунд
Цитата(Alek86 @ 11.8.2008,  12:27)
что тут <> означает?

http://forum.vingrad.ru/forum/topic-223092...tor-friend.html

Вот старая тема, тут все освещено
PM MAIL ICQ Skype   Вверх
Alek86
Дата 11.8.2008, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



не знаю, где ты это правило взял

напиши (прям в классе) так
Код

  //Operations for work with streams
  friend std::istream &operator>>(std::istream& IO, List<T> &Spisok)
  {//IO - input stream, Spisok - List of objects
    T Obj;
    IO >> Obj;
    Spisok.AddElem(Obj,0);
    return IO;
  }

и не мучься


--------------------
user posted image    user posted image
PM MAIL   Вверх
PirateTigo
Дата 11.8.2008, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 4.8.2008

Репутация: нет
Всего: нет



Цитата(Alek86 @ 11.8.2008,  12:37)
не знаю, где ты это правило взял

Вот здесь взял:
http://www.parashift.com/c++-faq-lite/temp....html#faq-35.16

Сделал как ты сказал, все работает, но все же это не решение проблемы, я думаю...

PM MAIL ICQ Skype   Вверх
Alek86
Дата 11.8.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(PirateTigo @  11.8.2008,  12:53 Найти цитируемый пост)
но все же это не решение проблемы, я думаю...

почему ты так думаешь?
ты реализовал друга прямо в классе

Добавлено @ 13:13
кстати говоря, в твоем случае friend не нужен - вынеси ф-ю из класса

Это сообщение отредактировал(а) Alek86 - 11.8.2008, 13:14


--------------------
user posted image    user posted image
PM MAIL   Вверх
PirateTigo
Дата 11.8.2008, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 4.8.2008

Репутация: нет
Всего: нет



Ок, тема закрыта, всем спасибо..  smile 
PM MAIL ICQ Skype   Вверх
UnrealMan
Дата 11.8.2008, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Alek86 @  11.8.2008,  13:27 Найти цитируемый пост)
что тут <> означает?

Это называется "тупо изменяем код до тех пор, пока не начнёт компилироваться". А то, что компилироваться при этом будет не корректная с точки зрения языка программа, а полная чушь - дело десятое  smile 

Прежде чем делать что-то со специализациями класса (в т.ч. объявлять их друзьями кого-то), нужно объявить первичный шаблон - в данном случае это значит поместить перед определением шаблона List

Код

template <class T>
    class List;

template <class T>
    std::istream &operator>>(std::istream& IO, List<T> &Spisok);


Это сообщение отредактировал(а) UnrealMan - 11.8.2008, 16:35
PM MAIL   Вверх
PirateTigo
Дата 11.8.2008, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 4.8.2008

Репутация: нет
Всего: нет



Цитата(UnrealMan @ 11.8.2008,  16:18)
Это называется "тупо изменяем код до тех пор, пока не начнёт компилироваться". А то, что компилироваться при этом будет не корректная с точки зрения языка программа, а полная чушь - дело десятое

Я вверху дал ссылку, где об "этом" подробно написано!

Так что, не нужно обвинять меня в безрассудстве действий!

Это сообщение отредактировал(а) PirateTigo - 11.8.2008, 20:34
PM MAIL ICQ Skype   Вверх
Alek86
Дата 11.8.2008, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(PirateTigo @  11.8.2008,  20:32 Найти цитируемый пост)
Так что, не нужно обвинять меня в безрассудстве действий!

вообще-то он по делу говорит
и в приведеной тобой ссылке то же самое написано, что и у него


--------------------
user posted image    user posted image
PM MAIL   Вверх
PirateTigo
Дата 13.8.2008, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 4.8.2008

Репутация: нет
Всего: нет



Цитата(Alek86 @ 11.8.2008,  22:36)
и в приведеной тобой ссылке то же самое написано, что и у него

Вообще-то там приводится три выхода из ситуации, один из них мой. Поэтому не правда, что я сделал не подумав.
PM MAIL ICQ Skype   Вверх
UnrealMan
Дата 13.8.2008, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(PirateTigo @  13.8.2008,  20:22 Найти цитируемый пост)
Вообще-то там приводится три выхода из ситуации, один из них мой. Поэтому не правда, что я сделал не подумав. 

Ответь на пару вопросов:

1) что в твоём примере делает следующая строчка?

friend std::istream &operator>><>(std::istream &,List<T> &);

2) Что в этой строчке означает <>?


PM MAIL   Вверх
PirateTigo
Дата 15.8.2008, 04:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 4.8.2008

Репутация: нет
Всего: нет



Цитата(UnrealMan @ 13.8.2008,  20:50)
1) что в твоём примере делает следующая строчка?

friend std::istream &operator>><>(std::istream &,List<T> &);

2) Что в этой строчке означает <>?

Я не отвечаю на 100%, что это так. Так как сам ничего об этом раньше не слышал. Но раз в статье написано, что это решает проблему, то почему бы и не использовать эту "magic stuff" <>. И в той статье описано, что именно происходит, когда компилятор видит <>:
"After the compiler sees that magic stuff, it will be better informed about the friend functions. In particular, it will realize that the friend lines are referring to functions that are themselves templates. That eliminates the confusion." Мне этого описания вполне достаточно для того, чтобы использовать <> в своей программе, и то что я не нашел лучшего вовсе не означает, что я сделал это наобум.
PM MAIL ICQ Skype   Вверх
UnrealMan
Дата 15.8.2008, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Я вот только не понял, откуда ты тогда сделал вывод, что

Цитата(PirateTigo @  4.8.2008,  15:13 Найти цитируемый пост)
Оказывается при объявлении дружественных шаблонов функций для шаблона класса нужно либо заранее объявлять прототипы класса и функции, либо писать <> после названия функции.
?
Почему "либо", когда предварительное объявление шаблона функции просто обязано присутствовать, если ты пишешь

Код

friend std::istream &operator>><>(std::istream &,List<T> &);
?

Это сообщение отредактировал(а) UnrealMan - 15.8.2008, 12:09
PM MAIL   Вверх
PirateTigo
Дата 19.8.2008, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 4.8.2008

Репутация: нет
Всего: нет



Ну не знаю, как я понял, потому что использование <> - это тоже самое для шаблона френд функции, что и extern для какой-нибудь внешней переменной. Если не так, то поправь меня.
PM MAIL ICQ Skype   Вверх
Alek86
Дата 19.8.2008, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(PirateTigo @  19.8.2008,  12:57 Найти цитируемый пост)
Если не так, то поправь меня.

как тебя можно поравить, если уже 10 раз было сказано, как нужно писать правильно, а ты все равно стоишь на своем?
можно только сказать РТФМ (в частности, "Шаблоны C++")


--------------------
user posted image    user posted image
PM MAIL   Вверх
bsa
Дата 19.8.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



PirateTigo
Цитата
The solution is to convince the compiler while it is examining the class body proper that the operator+ and operator<< functions are themselves templates. There are several ways to do this; one simple approach is pre-declare each template friend function above the definition of template class Foo: 
Код
 template<typename T> class Foo;  // pre-declare the template class itself
 template<typename T> Foo<T> operator+ (const Foo<T>& lhs, const Foo<T>& rhs);
 template<typename T> std::ostream& operator<< (std::ostream& o, const Foo<T>& x); 

Also you add <> in the friend lines, as shown: 
Код
 #include <iostream>
 
 template<typename T>
 class Foo {
 public:
   Foo(const T& value = T());
   friend Foo<T> operator+ <> (const Foo<T>& lhs, const Foo<T>& rhs);
   friend std::ostream& operator<< <> (std::ostream& o, const Foo<T>& x);
 private:
   T value_;
 }; 
After the compiler sees that magic stuff, it will be better informed about the friend functions. In particular, it will realize that the friend lines are referring to functions that are themselves templates. That eliminates the confusion.
Свободный перевод особо важных мест в двух словах: первый метод заключается в предопределении шаблонных функции до описания шаблонного класса Foo... а так же (also - переводится как "а так же") добавлении <> в объявление дружественных шаблонных функций.
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0699 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.