Russian Qt Forum

Программирование => С/C++ => Тема начата: yngwie от Июнь 20, 2009, 15:20



Название: Шаблоны
Отправлено: yngwie от Июнь 20, 2009, 15:20
здравствуйте вот код, есть пара вопросов:
Код:
#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()), это же и так понятно что это функция шаблонного класса


Название: Re: Шаблоны
Отправлено: spectre71 от Июнь 20, 2009, 16:09
Насколько я понимаю, поскольку можно сделать так
void Pair<int>::showQ()
{
    std::cout<<x/y<<std::endl;
}
Для конкретного типа. Но я могу ошибаться.


Название: Re: Шаблоны
Отправлено: denka от Июнь 20, 2009, 20:27
1 Не правильно. Потому как конструктор вобще может не использывать шаблонный тип. Но при объявлении объекта типом которого являеться шаблонный класс ты всегда должен указывать конкретный тип. Это позволяет компилятору сгенерировать нужный тип "на лету"

2 Грубо говоря синтаксис такой :). Компилятор требует наличия имени класса перед именем члена ф-ции


Название: Re: Шаблоны
Отправлено: spectre71 от Июнь 20, 2009, 21:17
2 Грубо говоря синтаксис такой :). Компилятор требует наличия имени класса перед именем члена ф-ции
Синтаксис от фонаря не изобретается, в нормальных языках он несет семантическую нагрузку, так что это не ответ.


Название: Re: Шаблоны
Отправлено: yngwie от Июнь 21, 2009, 14:30
Это позволяет компилятору сгенерировать нужный тип "на лету"
значит везде где в шаблонном классе объявлен тип Т, то он будет заменен на тот что указан при создании объекта, это также касается и реализаций функций, которые описаны в этом классе. так?


Название: Re: Шаблоны
Отправлено: denka от Июнь 21, 2009, 15:56
Именно


Название: Re: Шаблоны
Отправлено: denka от Июнь 21, 2009, 16:09
2 Грубо говоря синтаксис такой :). Компилятор требует наличия имени класса перед именем члена ф-ции
Синтаксис от фонаря не изобретается, в нормальных языках он несет семантическую нагрузку, так что это не ответ.

Хм.. Ну дал бы тогда полноценный ответ. Вот тебе ответ:
Цитировать
Члены шаблона класса объявляются и определяются точно так же, как и для обычного класса. Член шаблона не обязательно определять внутри самого шаблона. В этом случае где-то должно существовать его определение, точно так же, как и в случае с классом не являющемся шаблоном. Члены шаблоны класса в свою очередь являются шаблонами, параметризованными при помощи аргументов шаблона