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

template <class T> - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 75, средняя оценка - 4.76
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
03.06.2011, 21:45     template <class T> #1
Куда вставлять 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>, дабы компильнулось... А с названием темы я напортачил что-то.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
insolent
 Аватар для insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
03.06.2011, 21:59     template <class T> #2
kravam, соберись, хорошо подумай и понятно напиши, что ты хотел!
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
03.06.2011, 22:07  [ТС]     template <class T> #3
Как компильнуть второй код. Надеюсь, его логика ясна. И он не должна нарушиться. То есть дружественная функция должна остаться дружественной, а принимаемый аргумент должен иметь тип <имя класса>, которому эта дружественная функция принадлежит.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 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
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
03.06.2011, 22:21  [ТС]     template <class T> #5
Большое спасибо!
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 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
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
03.06.2011, 22:41     template <class T> #8
Чет немогу понять что эта ф-ция делает?

C++
1
2
template <class T>
void bithree_console_ (bithree& bi) {};
возвращает void, в теле пусто... как параметр используется непонятно.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
03.06.2011, 22:43     template <class T> #9
Avazart, а какая разница? Целью автора было понять, как объявлять соответствующие функции. Реализация их - дело десятое.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
03.06.2011, 22:48  [ТС]     template <class T> #10
Avazart, всегда так делай, упрощай код ДОНЕЛЬЗЯ, когда спрашиваешь о чём-нибудь и будешь получать нормальные ответы.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 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>
Еще ссылки по теме:

C++ Не пойму конструкцию template <template <class T> class X>
Ошибка с template <class T> C++
'MyQueue' : use of class template requires template argument list C++

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

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

Не по теме:

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

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

Текущее время: 04:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru