template метод
От: race1 Россия  
Дата: 31.01.06 16:20
Оценка:
А можно в не-template классе иметь template метод? Делаю так:
class CFileStream{
    template<class T> void Read(T& buf);
};
//
template<class T> void CFileStream::Read(T& buf)
{
...
}

И при вызове линкер говорит, например для переменной int: unresolved external symbol "public: void __thiscall CFileStream::Read(int &)"
Re: template метод
От: whaler Россия  
Дата: 31.01.06 16:23
Оценка:
Здравствуйте, race1, Вы писали:

Что сразу приходит в голову, а шаблонная функция-член определена в срр или в .h там же где и класс?
Re: template метод
От: jazzer Россия Skype: enerjazzer
Дата: 31.01.06 16:25
Оценка:
Здравствуйте, race1, Вы писали:

R>А можно в не-template классе иметь template метод? Делаю так:


можно

R>И при вызове линкер говорит, например для переменной int: unresolved external symbol "public: void __thiscall CFileStream::Read(int &)"


значит, у тебя не сгенерилось его тело, потому что ты его положил куда-нть не туда, либо положил туда, но не подключил к линковке, и т.д.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: template метод
От: race1 Россия  
Дата: 31.01.06 16:41
Оценка:
Функция определена в .h, а реализация в .cpp. В приведённом коде то что до "//" — это .h, а после — .cpp
Re[2]: template метод
От: Programmierer AG  
Дата: 31.01.06 16:45
Оценка:
Здравствуйте, race1, Вы писали:

R>Функция определена в .h, а реализация в .cpp. В приведённом коде то что до "//" — это .h, а после — .cpp

Не совсем верный, но краткий ответ — шаблоны нужно определять в заголовках.

Замечание по терминологии: template method — это design pattern, к шаблонам не имеющий отношения.
Re[3]: template метод
От: race1 Россия  
Дата: 31.01.06 16:52
Оценка:
Здравствуйте, Programmierer AG, Вы писали:

R>>Функция определена в .h, а реализация в .cpp. В приведённом коде то что до "//" — это .h, а после — .cpp

PA>Не совсем верный, но краткий ответ — шаблоны нужно определять в заголовках.

Т.е. определять? Объявлять? У меня же так и есть, шаблон (design pattern) объявляется в .h

PA>Замечание по терминологии: template method — это design pattern, к шаблонам не имеющий отношения.


Буду знать
Re[4]: template метод
От: jazzer Россия Skype: enerjazzer
Дата: 31.01.06 16:58
Оценка:
Здравствуйте, race1, Вы писали:

R>Здравствуйте, Programmierer AG, Вы писали:


R>>>Функция определена в .h, а реализация в .cpp. В приведённом коде то что до "//" — это .h, а после — .cpp

PA>>Не совсем верный, но краткий ответ — шаблоны нужно определять в заголовках.

R>Т.е. определять? Объявлять? У меня же так и есть, шаблон (design pattern) объявляется в .h


определить функцию = написать ее тело.

на самом деле, если ты инстанцируешь функцию для какого-то типа в каком-нть объектнике А, то потом для этого же типа ты можешь звать ее из других объектников, в которых тела не видно — линкер возьмет ее реализацию из объектника А.

Фактически, это — технология как скрытия исходников шаблонов, так и ограничения инстанцируемых типов. Правда, человек и сам может для других типов написать реализацию, но никто этим в здравом уме заниматься не будет :)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: template метод
От: Programmierer AG  
Дата: 31.01.06 17:00
Оценка:
Здравствуйте, race1, Вы писали:

PA>>Не совсем верный, но краткий ответ — шаблоны нужно определять в заголовках.

R>Т.е. определять? Объявлять? У меня же так и есть, шаблон (design pattern) объявляется в .h
Нет, именно определять.
//file.hpp
#include <iostream>

struct NonTemplate {
  template <typename T>
  void templateMemberFunction(T arg) {
    std::cout << arg;
  }
};


А словосочетание design pattern ты понял неправильно . Это название для типового решение проектирования (поиск по GoF 1995). Есть такой шаблон проектирования (т.е. design pattern) — "template method", заключающийся в определении в базовом классе невиртуальной функции, реализованной в терминах одной или нескольких виртуальных. А для твоего вопроса правильный термин — template member function.
Re[5]: template метод
От: Павел Кузнецов  
Дата: 31.01.06 17:23
Оценка: 5 (1) +1 :)
Programmierer AG,

> для твоего вопроса правильный термин — template member function.


Почти: member function template. Т.е. "шаблон функции-члена", а не "шаблонная функция-член". В устаревшей терминологии template member function означало конкретные инстанцированные экземпляры шаблона.
Posted via RSDN NNTP Server 2.0
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: template метод
От: igna Россия  
Дата: 31.01.06 17:25
Оценка:
Здравствуйте, race1, Вы писали:

R>А можно в не-template классе иметь template метод? Делаю так:

R>class CFileStream{
R>    template<class T> void Read(T& buf);
R>};

Просто по поводу терминологии: В C++ это называется function template.
Re[6]: template метод
От: Programmierer AG  
Дата: 31.01.06 17:25
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

>> для твоего вопроса правильный термин — template member function.

ПК>Почти: member function template. Т.е. "шаблон функции-члена", а не "шаблонная функция-член". В устаревшей терминологии template member function означало конкретные инстанцированные экземпляры шаблона.

Эх, все моя вредная привычка умничать не по существу .
Re[2]: template метод
От: igna Россия  
Дата: 31.01.06 17:26
Оценка: :)
member function template
Re[5]: template метод
От: race1 Россия  
Дата: 02.02.06 15:10
Оценка:
Здравствуйте, Programmierer AG, Вы писали:

PA>Здравствуйте, race1, Вы писали:


PA>>>Не совсем верный, но краткий ответ — шаблоны нужно определять в заголовках.

R>>Т.е. определять? Объявлять? У меня же так и есть, шаблон (design pattern) объявляется в .h
PA>Нет, именно определять.

Вот блин... неудобно... А если класс тоже шаблонный, его методы должны определятся в .h?
Re[6]: template метод
От: igna Россия  
Дата: 02.02.06 15:20
Оценка:
Здравствуйте, race1, Вы писали:

R>Вот блин... неудобно... А если класс тоже шаблонный, его методы должны определятся в .h?


Да, но можно в начале файла объявить используемые шаблоны, а потом дать их определение.
Можно также определение дать в .cpp-файле и включить его в конце .h-файла, то есть прямо наоборот: не .h в .cpp, а .cpp в .h, и #include не в начале, а в конце.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.