Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 75, средняя оценка - 4.76
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,482
#1

template <class T> - C++

03.06.2011, 21:45. Просмотров 10223. Ответов 11
Метки нет (Все метки)

Куда вставлять template <class T> при определении функций, принимающих аргументы типа "класс"?дружественных фунгкций и вообще куда её вставлять
using namespace std;
В книгах описываются самые простые примеры, как-то:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using namespace std;
 
template <class T>
class bithree {
 public:
 
 bithree (){};
 void bithree_console_ ();
 
};
 
 
template <class T>
void bithree_console_ () {};
 
 
int main() {return 0;}
А чуть посложнее- и начинаются мытарства; камень преткновения- принимаемый аргумент

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <class T>
class bithree {
 public:
 
 bithree (){};
 friend void bithree_console_ (bithree& bi);
 
};
 
 
template <class T>
void bithree_console_ (bithree& bi) {};
 
 
int main() {return 0;}
В общем, наугад пихаю куда ни попадя <T> и template <class T>, дабы компильнулось... А с названием темы я напортачил что-то.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2011, 21:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос template <class T> (C++):

Friend template class with template class argument - C++
Помогите подружить 2 класса: Имеется класс Student: template &lt;class _T&gt; class Faculty; class Student{ friend...

Не пойму конструкцию template <template <class T> class X> - C++
Что это за шаблон такой?

Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier - C++
Решил подправить свой класс с использованием шаблонов, но столкнулся со следующим косяком. Если я прописываю тело функций внутри описания...

'MyQueue' : use of class template requires template argument list - C++
Написал код про шаблоны. Не могу понять почему выводит ошибку во время наследования класса. ошибки 'MyQueue' : use of class template...

В чем различие template <typename T> от template <class T> ? - C++
Добрый день ! Заметил в новых книгах применение записи template &lt;typename T&gt; вместо template &lt;class T&gt; в чем же тогда фишка...

Template class - C++
Возможно ли разделить шаблонный класс на два файла так, что в одном из файлов буду объявления, а в другом определения членов класса? ...

11
insolent
826 / 344 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
03.06.2011, 21:59 #2
kravam, соберись, хорошо подумай и понятно напиши, что ты хотел!
0
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,482
03.06.2011, 22:07  [ТС] #3
Как компильнуть второй код. Надеюсь, его логика ясна. И он не должна нарушиться. То есть дружественная функция должна остаться дружественной, а принимаемый аргумент должен иметь тип <имя класса>, которому эта дружественная функция принадлежит.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
03.06.2011, 22:16 #4
Вот небольшой гайд с пояснениями в виде комментов))

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream>
 
template< typename T >
class Foo
{
public:
    Foo(const T &);
 
    void func1() const;
    void func2(const Foo &) const;
    Foo func3() const;
    Foo func4(const Foo &) const;
 
private:
    T m_foo;
};
 
// Это пишется перед любым методом, определяемым вне класса.
// Говорим компилятору, чтобы сильно не удивлялся, увидев T
template< typename T >
// Здесь говорим, что конструктор Foo должен конструировать именно объект
// класса, инстанцированного как Foo< T > (т.е. именно для типа T)
// Так тоже пишем во всех функциях
Foo< T >::Foo(const T &foo):
m_foo(foo)
{
}
 
// Здесь по аналогии с конструктором
template< typename T >
void Foo< T >::func1() const
{
    std::cout << "func1: " << m_foo << std::endl;
}
 
template< typename T >
// Здесь говорим, что функция объекта класса, инстанцированного как Foo< T >,
// принимает в качестве параметра объект класса, инстанцированного таким же
// образом
void Foo< T >::func2(const Foo< T > &arg) const
{
    std::cout << "func2: " << arg.m_foo << std::endl;
}
 
template< typename T >
// Здесь сообщаем, что возвращать будем объект класса, инстанцированного так
// же, как инстанцирован объект, из которого вызывается функция
Foo< T > Foo< T >::func3() const
{
    std::cout << "func3: " << m_foo << std::endl;
 
    return *this;
}
 
// Здесь просто объединяем то, что делали в func2 и func3
template< typename T >
Foo< T > Foo< T >::func4(const Foo< T > &arg) const
{
    std::cout << "func4: " << arg.m_foo << std::endl;
 
    return *this;
}
 
int main()
{
    Foo< int > bar1(10);
    Foo< int > bar2(15);
 
    bar1.func1();
    bar1.func2(bar2);
 
    Foo< int > bar3 = bar1.func3();
    Foo< int > bar4 = bar1.func4(bar2);
 
    bar3.func1();
    bar4.func1();
 
    return 0;
}
Добавлено через 48 секунд
Сейчас по друзьям напишу.
3
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,482
03.06.2011, 22:21  [ТС] #5
Большое спасибо!
0
fasked
Эксперт С++
4945 / 2525 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
03.06.2011, 22:30 #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template <class T>
class bithree {
 public:
 
    bithree () {
    };
    
    template <T>
    friend void bithree_console_ (bithree<T>& bi);
};
 
 
template <class T>
void bithree_console_ (bithree<T>& bi) {
};
 
int main() {
    bithree<int> b;
    bithree_console_(b);
    
    return 0;
}
Добавлено через 9 минут
Ошибочка, простите, вот так надо было бы написать:
C++
1
2
    template <typename T2>
    friend void bithree_console_ (bithree<T2>& bi);
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
 
template <class T>
class bithree {
public:
 
    bithree () {
        data = 1;
    };
    
    T getData() {
        return data;
    }
 
    template <typename T2>
    friend void bithree_console_ (bithree<T2>& bi);
    
private:
 
    T data;
};
 
 
template <class T>
void bithree_console_ (bithree<T>& bi) {
    bi.data = 2;
};
 
 
int main() {
    bithree<int> b;
    std::cout << b.getData() << std::endl;
    
    bithree_console_(b);
    std::cout << b.getData() << std::endl;
    
    return 0;
}
В общем, смысл в том, что у функции и класс tempalte typename должен быть разный Потому что это в принципе относится к разным вещам.
1
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
03.06.2011, 22:31 #7
Друзья.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
 
// Просто объявляем класс, чтобы следующее объявление прототипа отработало
template< typename T >
class Foo;
 
// Объявляем прототип
template< typename T >
void friend_func(const Foo< T > &);
 
template< typename T >
class Foo
{
public:
    Foo(const T &);
 
    // Здесь явно указываем, что конкретная версия функции friend_func будет
    // дружественна конкретной версии класса
    friend void friend_func< T >(const Foo< T > &);
 
private:
    T m_foo;
};
 
// В остальном - никаких различий
 
template< typename T >
Foo< T >::Foo(const T &foo):
m_foo(foo)
{
}
 
template< typename T >
void friend_func(const Foo< T > &arg)
{
    std::cout << arg.m_foo << std::endl;
}
 
int main()
{
    Foo< int > bar1(10);
    Foo< double > bar2(1.2);
 
    friend_func(bar1);
    friend_func(bar2);
 
    return 0;
}
1
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,948
Записей в блоге: 17
03.06.2011, 22:41 #8
Чет немогу понять что эта ф-ция делает?

C++
1
2
template <class T>
void bithree_console_ (bithree& bi) {};
возвращает void, в теле пусто... как параметр используется непонятно.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
03.06.2011, 22:43 #9
Avazart, а какая разница? Целью автора было понять, как объявлять соответствующие функции. Реализация их - дело десятое.
0
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,482
03.06.2011, 22:48  [ТС] #10
Avazart, всегда так делай, упрощай код ДОНЕЛЬЗЯ, когда спрашиваешь о чём-нибудь и будешь получать нормальные ответы.
2
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,948
Записей в блоге: 17
04.06.2011, 00:01 #11
Оно то понятно , но делается это { // Комент : что-то делаем }
0
silent_1991
04.06.2011, 00:06     template <class T>
  #12

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
делается это { // Комент : что-то делаем }
Как видите, народ понял автора и без этого. Вопрос: так ли это надо?

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.06.2011, 00:06
Привет! Вот еще темы с ответами:

Ошибка с template <class T> - C++
Доброго времени суток! Изучаю С++ и не совсем разобрался с template. Вернее, я думаю, что понял, но компилятору виднее. В общем, он...

Шаблоны типа template<class T*> - C++
Здравствуйте, объясните пожалуйста, что означает сия запись: template&lt;class T*&gt;. И означает ли она, что я далее смогу использовать только...

Специализация nested template class - C++
Всем доброго дня. Сделал частичную развертку циклов с помощью шаблонов. Однако, если вспомогательную структуру inner_unroller сделать...

Как убрать template< class T >? - C++
Помогите убрать класы из кода и ещё, не могу понять почему всегда одни и те же числа выводит... #include &lt;iostream&gt; using namespace...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
04.06.2011, 00:06
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru