Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/34: Рейтинг темы: голосов - 34, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 14.09.2016
Сообщений: 153

Дружественная шаблонная функция

13.03.2019, 12:37. Показов 7451. Ответов 8

Студворк — интернет-сервис помощи студентам
Есть некоторая шаблонная функция, возвращающая void и имеющая некоторые параметры. Как сделать её дружественной для некоторого класса?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.03.2019, 12:37
Ответы с готовыми решениями:

Дружественная шаблонная функция шаблонного класса
Не компилируется. Подскажите правильный синтаксис. template<typename T> class A; template<typename T, typename ... Args> void...

Дружественная функция c++
Никак не пойму, как заставить void M заработать, хелп. Не видит переменные. #include <string> #include <stdio.h> ...

Дружественная функция
У меня есть класс, подсчитывающий количество равносторонних треугольников в заданном множестве точек на плоскости. Подскажите,...

8
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.03.2019, 13:00
Цитата Сообщение от Матричный бог Посмотреть сообщение
Как сделать её дружественной для некоторого класса?
Матричный бог, нужно понимать что
Цитата Сообщение от Матричный бог Посмотреть сообщение
шаблонная функция
это не функция. Терминология в программировании, это частенько набор слов, где нужно понимать смысл заклинания. Итак:
Цитата Сообщение от Матричный бог Посмотреть сообщение
шаблонная функция
Это описание способа создания функции (инстанцирования). Без инстанцирование нет кода для вызова. Для того чтобы построить дружественную функцию из шаблона, нужно специализировать шаблон функции и объявить специализацию дружественной функцией в том классе где вам это нужно.
0
0 / 0 / 0
Регистрация: 14.09.2016
Сообщений: 153
13.03.2019, 14:12  [ТС]
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
80
81
82
83
84
85
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <array>
#include <thread>
#include <chrono>
#include <thread>
#include <mutex>
using namespace std;
template <class T> class my_array {
    vector <T> veca;
    unsigned adt;
    unsigned gr;
    mutex * g;
    thread ** t;
public:
    my_array(vector<T> veca1) {
        veca = veca1;
        gr = veca.size();
        adt = gr/ 2;
        g = new mutex[adt];
        t = new thread*[adt];
    };
    friend void vn <T> (unsigned p, unsigned n, my_array<T>& th);
    void shelly(void) {
        int i;
        unsigned adt1 = adt;
        adt /= 2;
        for (unsigned j = adt / 2 + adt % 2, k = 1; adt > 0; j = adt / 2 + adt % 2, k++, adt /= 2) {
            for (i = 0; i < j; i++) {
                t[0] = new thread(vn<T>, adt1 - i, k, *this);
            }
        }
        for (i = 0; i < adt1; i++) {
            t[0]->join();
        }
    };
    void schell(void) {
        unsigned i, j, k;
        T t;
        for (k = gr / 2; k > 0; k /= 2)
            for (i = k; i < gr; i++)
            {
                t = veca[i];
                for (j = i; j >= k; j -= k)
                {
                    if (t < veca[j - k])
                        veca[j] = veca[j - k];
                    else
                        break;
                }
                veca[j] = t;
            }
    };
};
template <class TT> void vn(unsigned p, unsigned n, my_array<TT>& th) 
{
    unsigned i, j;
    TT t;
    unsigned k;
    for (k = th.adt + p, i = 0; i < n; k /= 2, i++) {
        th.g[p].lock();
        for (i = k; i < th.gr; i += k)
        {
            t = th.veca[i];
            for (j = i; j >= k; j -= k)
            {
                if (t < th.veca[j - k])
                    th.veca[j] = th.veca[j - k];
                else
                    break;
            }
            th.veca[j] = t;
        }
        th.g[p].unlock();
    }
}
int main()
{
    vector <double> oba = { 9.8, 8.33, 4.77, 8.77, 5.94, 4.11, 3.654 };
    my_array <double> jhu(oba);
    jhu.schell();
    jhu.shelly();
    return 0;
}
Вот тут я попытался специализировать шаблонную функцию vn. Но компилятор выдаёт ошибки.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
13.03.2019, 14:38
Матричный бог,
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
#include <iostream>
#include <vector>
#include <array>
#include <thread>
#include <chrono>
#include <thread>
#include <mutex>
using namespace std;
 
template <class T>
class my_array;
template <class T>
void vn(unsigned p, unsigned n, my_array<T>& th);
 
 
template <class T>
class my_array {
    vector <T> veca;
    unsigned adt;
    unsigned gr;
    mutex * g;
    thread ** t;
public:
    my_array(vector<T> veca1) { };
 
    template <typename T>
    friend void vn <T>(unsigned p, unsigned n, my_array<T>& th);
 
    void shelly() {};
    void schell() {};
};
 
template <class T>
void vn(unsigned p, unsigned n, my_array<T>& th)
{
 
}
 
int main()
{
    vector <double> oba = { 9.8, 8.33, 4.77, 8.77, 5.94, 4.11, 3.654 };
    my_array <double> jhu(oba);
    jhu.schell();
    jhu.shelly();
    return 0;
}
1
0 / 0 / 0
Регистрация: 14.09.2016
Сообщений: 153
13.03.2019, 16:21  [ТС]
Сделал так, как предложено выше. Всё равно выдаются ошибки.
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
80
81
82
83
84
85
86
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <array>
#include <thread>
#include <chrono>
#include <thread>
#include <mutex>
using namespace std;
template <class T> class my_array {
    vector <T> veca;
    unsigned adt;
    unsigned gr;
    mutex * g;
    thread ** t;
public:
    my_array(vector<T> veca1) {
        veca = veca1;
        gr = veca.size();
        adt = gr/ 2;
        g = new mutex[adt];
        t = new thread*[adt];
    };
    template <typename T>
    friend void vn <T>(unsigned p, unsigned n, my_array<T>& th);
    void shelly(void) {
        int i;
        unsigned adt1 = adt;
        adt /= 2;
        for (unsigned j = adt / 2 + adt % 2, k = 1; adt > 0; j = adt / 2 + adt % 2, k++, adt /= 2) {
            for (i = 0; i < j; i++) {
                t[0] = new thread(vn<T>, adt1 - i, k, *this);
            }
        }
        for (i = 0; i < adt1; i++) {
            t[0]->join();
        }
    };
    void schell(void) {
        unsigned i, j, k;
        T t;
        for (k = gr / 2; k > 0; k /= 2)
            for (i = k; i < gr; i++)
            {
                t = veca[i];
                for (j = i; j >= k; j -= k)
                {
                    if (t < veca[j - k])
                        veca[j] = veca[j - k];
                    else
                        break;
                }
                veca[j] = t;
            }
    };
};
template <class T>
void vn(unsigned p, unsigned n, my_array<T>& th){
    unsigned i, j;
    T t;
    unsigned k;
    for (k = th.adt + p, i = 0; i < n; k /= 2, i++) {
        th.g[p].lock();
        for (i = k; i < th.gr; i += k)
        {
            t = th.veca[i];
            for (j = i; j >= k; j -= k)
            {
                if (t < th.veca[j - k])
                    th.veca[j] = th.veca[j - k];
                else
                    break;
            }
            th.veca[j] = t;
        }
        th.g[p].unlock();
    }
}
int main()
{
    vector <double> oba = { 9.8, 8.33, 4.77, 8.77, 5.94, 4.11, 3.654 };
    my_array <double> jhu(oba);
    jhu.schell();
    jhu.shelly();
    return 0;
}
Ошибка C2988 неопознанное объявление или определение шаблона ConsoleApplication12 c:\users\z\documents\visual studio 2015\projects\consoleapplication12\conso leapplication12\consoleapplication12.cpp строка 25
и другие, но эта главная.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.03.2019, 17:58
Матричный бог, у вас проблема излагаемая в трёх строках:
-есть шаблонный класс и нужно объявить шаблонную функцию в друзья
-код класса (без ракетостроения, потоков, мьютексов, блекджеков и куртизанок)
-код функции
Давать такую простыню, - садо-мазохизм.
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
#include <iostream>
#include <vector>
#include <array>
#include <string>
using namespace std;
template <class T> class my_array;//forwald dcl for your vn
template <class T>
void vn   (unsigned p, unsigned n, my_array<T>& th);//forward dcl for
// specialzation in class to friend declaration
 
template <class T> class my_array {
    vector <T> veca;
    unsigned adt;
    unsigned gr;
    string hru;
 
public:
    my_array(vector<T> veca1) {
        veca = veca1;
        gr = veca.size();
        adt = gr/ 2;
        hru="hru";
 
    };
 
    friend void vn <T> (unsigned p, unsigned n, my_array<T>& th);
 
    };
 
template <class TT> void vn(unsigned p, unsigned n, my_array<TT>& th)
{
   cout<<th.hru<<endl;//access to private field
}
int main()
{
    vector <double> oba = { 9.8, 8.33, 4.77, 8.77, 5.94, 4.11, 3.654 };
    my_array <double> jhu(oba);
vn<double>(0,0, jhu);
    return 0;
}
Добавлено через 1 час 4 минуты
ps
Матричный бог, я посмотрел пост rikimaru2013, и практически у него всё сделано хорошо. Если у вас проблемы, то, скорее всего, по причине того, что всё в куче.
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
13.03.2019, 18:09
Цитата Сообщение от Матричный бог Посмотреть сообщение
Сделал так, как предложено выше. Всё равно выдаются ошибки.
А теперь попробуйте найти 20ть отличий между тем как вы сделали, и как было предложено выше)))
1
0 / 0 / 0
Регистрация: 14.09.2016
Сообщений: 153
13.03.2019, 18:41  [ТС]
Касаемо кода, который мне предложили в 1 раз, у меня компилятор ругается на template <typename T> внутри класса. Хз почему.
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
13.03.2019, 18:54
Цитата Сообщение от Матричный бог Посмотреть сообщение
у меня компилятор ругается на template <typename T> внутри класса. Хз почему.
Компиляторы вредничают.
Они не любят когда код пишут абы как.
Им нужно, что бы все было по честному, и по правилам.

https://rextester.com/JGQDV33397

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
#include <iostream>
#include <vector>
#include <array>
#include <thread>
#include <chrono>
#include <thread>
#include <mutex>
using namespace std;
 
template <class T>
class my_array;
template <class T>
void vn(unsigned p, unsigned n, my_array<T>& th);
 
 
template <class T>
class my_array {
    vector <T> veca;
    unsigned adt;
    unsigned gr;
    mutex * g;
    thread ** t;
public:
    my_array(vector<T> /*veca1*/) 
        : veca()
        , adt()
        , gr()
        , g()
        , t()
    {};
    
    my_array(const my_array&) = delete;
    my_array& operator=(const my_array&) = delete;
 
    
    friend void vn <T>(unsigned p, unsigned n, my_array<T>& th);
 
    void shelly() {};
    void schell() {};
};
 
template <class T>
void vn(unsigned /*p*/, unsigned n, my_array<T>& /*th*/)
{
 
}
 
int main()
{
    vector <double> oba = { 9.8, 8.33, 4.77, 8.77, 5.94, 4.11, 3.654 };
    my_array <double> jhu(oba);
    jhu.schell();
    jhu.shelly();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.03.2019, 18:54
Помогаю со студенческими работами здесь

Дружественная функция
Хочу сделать вычисление площади как дружественную функцию, начал описывать, дальше догнать не могу как кодить. Подскажите? #include...

Дружественная функция
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; class massiv { int len,*p_mas; public : massiv() {} massiv...

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

Дружественная функция
Здравствуйте. Написал программу, которая должна матрицу умножать на число, но я не понимаю как вызвать дружественную функцию... Помогите...

Дружественная 2-м классам функция.
Код программы: #include &lt;iostream.h&gt; class matrix; class vector{ int size; int* vec; public: vector(int sz = 2){vec...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru