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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> шаблоны 
V
    Опции темы
yngwie19
Дата 20.6.2009, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

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



здравствуйте вот код, есть пара вопросов:
Код

#include "stdafx.h"
#include <iostream>

template <class T>
class Pair
{
public:
    Pair(T x1, T y1) : x(x1), y(y1){;}
    void showQ();
private:
    T x,y;
};

int _tmain(int argc, _TCHAR* argv[])
{
    Pair<double> a(37.0,5.0);
    Pair<int> u(37,5);

    a.showQ();
    u.showQ();

    return 0;
}

template <class T>
void Pair<T>::showQ()
{
    std::cout<<x/y<<std::endl;
}


1) при объявлении
Код

Pair<double> a(37.0,5.0);
Pair<int> u(37,5);

Мы указываем шаблонному классу, параметры какого типа мы передаем в конструктор, чтобы шаблонный класс мог сформировать конструктор соответствующего типа. Правильно?
2) Зачем при описании функции show(), в названии класса добавляется <T> (Pair<T>::showQ()), это же и так понятно что это функция шаблонного класса. 

Это сообщение отредактировал(а) yngwie19 - 20.6.2009, 15:20
PM MAIL   Вверх
azesmcar
Дата 20.6.2009, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Странный вопрос, это синтаксис языка smile

Это сообщение отредактировал(а) azesmcar - 20.6.2009, 15:29
PM   Вверх
yngwie19
Дата 20.6.2009, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

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



azesmcar, все два странных?
почему нельзя так написать?
Код

void Pair::showQ()
{
    std::cout<<x/y<<std::endl;
}

PM MAIL   Вверх
zim22
Дата 20.6.2009, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(yngwie19 @  20.6.2009,  15:19 Найти цитируемый пост)
Зачем... в названии класса добавляется <T>?

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

вот пример:
для типа kaka необходимо указать, во-первых, в какой области видимости он находится, 
во-вторых, тип шаблонного параметра для которого будет создана шаблонная версия класса C<T>::
Код

template <typename T>
class C {
public:
  typedef int kaka;
  C(){}
  kaka fcn();
};

template <typename T>
typename C<T>::kaka C<T>::fcn() {
  return 0;
}


Это сообщение отредактировал(а) zim22 - 20.6.2009, 15:46


--------------------
PM MAIL   Вверх
azesmcar
Дата 20.6.2009, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(yngwie19 @  20.6.2009,  15:19 Найти цитируемый пост)
Мы указываем шаблонному классу, параметры какого типа мы передаем в конструктор, чтобы шаблонный класс мог сформировать конструктор соответствующего типа. Правильно?

первый вопрос не заметил.
нет, неправильно. Мы указываем тип, чтобы компилятор сгенерировал копию класса для этого типа. Если специализаций нет - компилятор сгенерирует новый класс, если специализации есть - будет использовать специализированный.

вот пример
Код

#include <iostream>

template <class T>
struct A
{
    enum {v = 0};
};

template <>
struct A<int>
{
    enum {v = 1};
};

template <>
struct A<double>
{
    enum {v = 2};
};

int main()
{
    std::cout << A<int>::v << std::endl; //используется специализация, выведет 1
    std::cout << A<double>::v << std::endl; //используется специализация, выведет 2
    std::cout << A<float>::v << std::endl; //выведет 0
    std::cout << A<char>::v << std::endl; //выведет 0
}


Это сообщение отредактировал(а) azesmcar - 20.6.2009, 15:41
PM   Вверх
W4FhLF
Дата 20.6.2009, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Цитата(yngwie19 @  20.6.2009,  15:32 Найти цитируемый пост)
почему нельзя так написать?


Если тело метода будешь внутри class {...} писать, то можно и так. Иначе необходимо указать список и имена параметров шаблона. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
andrew_121
Дата 20.6.2009, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Цитата(azesmcar @  20.6.2009,  15:28 Найти цитируемый пост)
это синтаксис языка

Цитата(yngwie19 @  20.6.2009,  15:32 Найти цитируемый пост)
почему нельзя так написать?

GCC доступен в исходниках. Можешь исправить это неудобство)


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
yngwie19
Дата 20.6.2009, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

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



W4FhLF, получается что если написать так
Код

void Pair::showQ()
{
    std::cout<<x/y<<std::endl;
}

то коплилятор будет искать не-шаблонную функцию?
PM MAIL   Вверх
mes
Дата 20.6.2009, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(yngwie19 @  20.6.2009,  15:52 Найти цитируемый пост)

то комплилятор будет искать не-шаблонную функцию? 

не-шаблонную функцию не-шаблонного класса.



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


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(yngwie19 @  20.6.2009,  16:52 Найти цитируемый пост)
то коплилятор будет искать не-шаблонную функцию?

да

подумайте сами. есть у вас шаблонный класс. вы его частично специализируете. как компилятору определить какую именно функцию вы определяете(шаблонную или специализированную), если вы не указываете параметры шаблона?

Это сообщение отредактировал(а) zim22 - 20.6.2009, 17:23


--------------------
PM MAIL   Вверх
yngwie19
Дата 20.6.2009, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

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



да точно. Я еще наверное может быть так, есть 2 шаблонных класса T и P и у одного и у другого присутствует метод showQ, чтобы правильно описать реализацию этой функции нужно писать так?
Код

void Pair<T>::showQ()
{
    std::cout<<x/y<<std::endl;
}

void Pair<P>::showQ()
{
    std::cout<<y/x<<std::endl;
}


или так класс нельзя объявлять?

PM MAIL   Вверх
yngwie19
Дата 20.6.2009, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

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



Цитата(azesmcar @  20.6.2009,  15:40 Найти цитируемый пост)
нет, неправильно. Мы указываем тип, чтобы компилятор сгенерировал копию класса для этого типа. 

другими словами, если мы указываем при создании объекта например тип double:
Код

Pair<double> a(37.0,5.0);


то при создании объекта a, везде где в его описаниях встречается "тип" T, он будет заменен на double?

Код

class Pair
{
public:
    Pair(double x1, double y1) : x(x1), y(y1){;}
    void showQ();
private:
    double x,y;
};

int main()
{
 ......
}

void Pair<double>::showQ()
{
    std::cout<<x/y<<std::endl;
}


Это сообщение отредактировал(а) yngwie19 - 20.6.2009, 18:27
PM MAIL   Вверх
andrew_121
Дата 20.6.2009, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



yngwie19, Да.



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
zim22
Дата 20.6.2009, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(yngwie19 @  20.6.2009,  18:02 Найти цитируемый пост)
или так класс нельзя объявлять?

попробуйте smile


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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