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

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

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

template <class T> - C++

03.06.2011, 21:45. Просмотров 9949. Ответов 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>, дабы компильнулось... А с названием темы я напортачил что-то.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2011, 21:45     template <class T>
Посмотрите здесь:

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

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

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

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

подскажите template<class> (Шаблоны и указатели) - C++
circl.h #ifndef _CIRCL_H #define _CIRCL_H template &lt;class t&gt; class circl{ private: circl *pNext,*pBack; public: t...

Почему сын может спокойно работать с полями privat отцовского класса (опять template <class T> воду мутит!) - C++
Сабж class otets { public: otets (){}; private: int znach; }; template &lt;class T&gt; class sinn: public otets {

Template argument required for class "LinkedListIterator" - C++
#ifndef LINKEDLIST_H #define LINKEDLIST_H #include &lt;iostream&gt; using namespace std; template &lt;typename Type&gt; class...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
03.06.2011, 21:59     template <class T> #2
kravam, соберись, хорошо подумай и понятно напиши, что ты хотел!
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
03.06.2011, 22:07  [ТС]     template <class T> #3
Как компильнуть второй код. Надеюсь, его логика ясна. И он не должна нарушиться. То есть дружественная функция должна остаться дружественной, а принимаемый аргумент должен иметь тип <имя класса>, которому эта дружественная функция принадлежит.
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
03.06.2011, 22:16     template <class T> #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 секунд
Сейчас по друзьям напишу.
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
03.06.2011, 22:21  [ТС]     template <class T> #5
Большое спасибо!
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
03.06.2011, 22:30     template <class T> #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 должен быть разный Потому что это в принципе относится к разным вещам.
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
03.06.2011, 22:31     template <class T> #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;
}
Avazart
Эксперт С++
7121 / 5298 / 273
Регистрация: 10.12.2010
Сообщений: 23,431
Записей в блоге: 17
03.06.2011, 22:41     template <class T> #8
Чет немогу понять что эта ф-ция делает?

C++
1
2
template <class T>
void bithree_console_ (bithree& bi) {};
возвращает void, в теле пусто... как параметр используется непонятно.
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
03.06.2011, 22:43     template <class T> #9
Avazart, а какая разница? Целью автора было понять, как объявлять соответствующие функции. Реализация их - дело десятое.
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
03.06.2011, 22:48  [ТС]     template <class T> #10
Avazart, всегда так делай, упрощай код ДОНЕЛЬЗЯ, когда спрашиваешь о чём-нибудь и будешь получать нормальные ответы.
Avazart
Эксперт С++
7121 / 5298 / 273
Регистрация: 10.12.2010
Сообщений: 23,431
Записей в блоге: 17
04.06.2011, 00:01     template <class T> #11
Оно то понятно , но делается это { // Комент : что-то делаем }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.06.2011, 00:06     template <class T>
Еще ссылки по теме:

базовый и производный класс, в базовом объявлена переменная "protected", она недоступна по имени в производном классе! template <class T> воду мутит! - C++
Друзья! Вот код #include &lt;stdio.h&gt; template &lt;class T&gt; class otets { protected: int peremennaya; }; template &lt;class...

MSVC и template template classes - C++
Приветствую. Как в MSVC передать template template класс? Простой пример template&lt;template&lt;typename, typename&gt; class Return&gt; ...

enum и class как составляющие другого class - C++
Как организовать ввод enuma с клавиатуры (51-я строка)? Как прикрепить класс date к employee в private? :wall: #include &lt;iostream&gt; ...

vector<[class]> in class и перегрузка (ostream) - C++
Доброе всем время суток ) столкнулся с проблемой Есть у меня несколько классов и есть класс внутри которого созданы векторы хранящие...

public class && static class - C++
Вообщем у меня небольшая связка, которую я хотел бы использовать в программе своей, но компилятор мне выдает ошибку и я не знаю что все...


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

Или воспользуйтесь поиском по форуму:
silent_1991
04.06.2011, 00:06     template <class T>
  #12

Не по теме:

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

Yandex
Объявления
04.06.2011, 00:06     template <class T>
Ответ Создать тему
Опции темы

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