Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484

template при передаче объекта

02.12.2019, 16:26. Показов 2457. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Зачем нужно
C++
1
template<typename type1>
перед конструктором? Поему нельзя передать объект типа test1 по ссылке без templat'ов?

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
#include <iostream>
 
using namespace std;
template <class type2>
class test1 {
 
};
template <class type1>
class test {
public:
    template<typename type1>
    test(const test1<type1> & obj) {
        type1 obj1 = 5;
        std::cout << obj1;
        int a = 5;
    }
 
};
 
 
int main()
{
    test1<int> obj;
    test<char> obj1(obj);
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.12.2019, 16:26
Ответы с готовыми решениями:

Не работает класс при передаче в функцию объекта
Всем привет, я не пойму подскажите куда правильно подставить #include &quot;doodler.h&quot; чтобы не было ошибок. Есть класс, который содержит...

Ошибка при передаче объекта класса в функцию, а может и нет
Здравствуйте, гляньте пожалуйста код, в чем проблема? Спасибо. Ошибка : main.cpp:73:5: error: use of undeclared identifier 'Scan' ...

Template definition of non-template при использовании частичной спецификации шаблонов
Всем привет! Есть задача написать шаблон класса, принимающего в качестве параметров типа шаблон и некоторый тип. Собственно, вот код: ...

20
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
02.12.2019, 16:45
у тебя и это не должно работать typename type1 затеняет class type1
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
02.12.2019, 16:47  [ТС]
Raali, в компиляторе vs все работает

Добавлено через 1 минуту
и еще как вообще это работает? тип сначала передается в template а потом в
Цитата Сообщение от ReYalp Посмотреть сообщение
const test1<type1> & obj
или наоборот?
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
02.12.2019, 16:52
Цитата Сообщение от ReYalp Посмотреть сообщение
тип сначала передается в template а потом
он должен подставиться вовсюда где стоит type1, какая разница в очередности то?

вот инстанциируешь ты темплейт интом - у тебя будет такой код генерироваться, если убрать при этом темплейт от конструктора (потому что зачем тебе 2 темплейта с одинаковым именем? либо нужны различные имена, если хочешь инстанциировать класс интом а конструктор чаром)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class test {
public:
    test(const test1<int> & obj) {
        int obj1 = 5;
        std::cout << obj1;
        int a = 5;
    }
 
};
 
// инстанциируешь char'ом
 
class test {
public:
    test(const test1<char> & obj) {
        char obj1 = 5;
        std::cout << obj1;
        int a = 5;
    }
 
};
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
02.12.2019, 16:58  [ТС]
Raali, зачем там вообще этот template нужен?

Добавлено через 1 минуту
Цитата Сообщение от ReYalp Посмотреть сообщение
template<typename type1>
тут
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
02.12.2019, 16:59
Цитата Сообщение от ReYalp Посмотреть сообщение
зачем там вообще этот template нужен?
потому что int != char
и для этого нужно два типа и соответственно 2 темплейта
попробуй просто подставь char вместо type1 (код выше)
как ты передашь в конструктор test1<int> если он принимает test1<char>?

единственное только что имя темплейт аргумента конструктора должно отличаться от класса, не знаю как оно компилится у тебя и какой в этом смысл
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
02.12.2019, 17:03  [ТС]
Raali, Вы что-то не так поняли,я не об этом ,зачем создавать целый шаблон чтобы просто передать один объект,разве нельзя сделать по-другому?
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
02.12.2019, 17:06
Цитата Сообщение от ReYalp Посмотреть сообщение
разве нельзя сделать по-другому?
смотря какой изначально смысл закладывался

если нужно чтобы конструктор принимал любой тип, то как иначе? создавать для каждого типа по конструктору?
C++
1
2
3
test(int&) {}
test(char&) {}
test(double&) {}
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
02.12.2019, 18:19
Цитата Сообщение от ReYalp Посмотреть сообщение
template <class type1>
class test {
public:
    template<typename type1>
    test(const test1<type1> & obj) {

нет смысла обсуждать невалидный код.

исправь ошибку.
например так:
C++
1
2
3
4
5
template <class type1>
class test {
public:
    template<typename type2>
    test(const test1<type2> & obj) {
и тогда причина, почему конструктор - шаблон,
станет очевидной.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
03.12.2019, 12:02  [ТС]
hoggy, просто я взял именно этот пример с написанного уже кода ,который писал сеньйор

Добавлено через 1 минуту
и в нем два типа называются одинаково
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
03.12.2019, 12:11
Цитата Сообщение от ReYalp Посмотреть сообщение
hoggy, просто я взял именно этот пример с написанного уже кода ,который писал сеньйор
Добавлено через 1 минуту
и в нем два типа называются одинаково
То что они называются одинаково, это неважно, имя просто переопеределяется. Там надо смотреть по коду, что делается. Возможно это ошибка, а возможно нет - класс test<T1> можно сконструировать из класса test<T2>.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
03.12.2019, 12:12  [ТС]
oleg-m1973, я думаю это ошибка т.к. не зря там class и typename
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
03.12.2019, 12:18
Цитата Сообщение от ReYalp Посмотреть сообщение
oleg-m1973, я думаю это ошибка т.к. не зря там class и typename
Здесь мы можем только гадать.
В твоём классе test это не ошибка, вполне корректный код (ну, там, где касается шаблона).
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
03.12.2019, 12:21  [ТС]
oleg-m1973, почему такой синтаксис? Похоже на шаблонную функцию ,но если бы это была она то было бы <type> после ее имени при вызове ,а так нету, получается мы при передаче объекта
Цитата Сообщение от ReYalp Посмотреть сообщение
test<char> obj1(obj);
передаем его тип сначала в
Цитата Сообщение от ReYalp Посмотреть сообщение
template<typename type1>
а потом в
Цитата Сообщение от ReYalp Посмотреть сообщение
test(const test1<type1> & obj)
или наоборот?
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
03.12.2019, 12:22
Ты вы итоге то понял что к чему? зачем он это написал никто не знает и не узнает, нет смысла так делать, даже если это и работает где то
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
03.12.2019, 12:24  [ТС]
Raali, я не спрашиваю о его ошибке , представьте что код вообще без того templat'а класса , я спрашиваю о templat'е функции ,или как его назвать правильно
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
03.12.2019, 12:28
Цитата Сообщение от ReYalp Посмотреть сообщение
то было бы <type> после ее имени при вызове
нет, шаблон может быть неявно определен по параметру

C++
1
test<int>(5);
не нужно писать для

C++
1
2
template<typename T>
void test(T t);
можно просто

C++
1
test(5);
Добавлено через 3 минуты
Цитата Сообщение от ReYalp Посмотреть сообщение
представьте что код вообще без того templat'а класса
тогда не совсем понятен вопрос, все сводится к тому зачем вообще в С++ темплейты?
или все же к тому, зачем именно у конструктора темплейт
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
03.12.2019, 12:29  [ТС]
Raali, ок,тогда почему я не могу его явно указать?

Добавлено через 1 минуту
Raali,
Цитата Сообщение от Raali Посмотреть сообщение
тогда не совсем понятен вопрос, все сводится к тому зачем вообще в С++ темплейты?
Вы меня совсем не понимаете,
Цитата Сообщение от ReYalp Посмотреть сообщение
template <class type1>
-это меня не интересует,
мне интересует только это
Цитата Сообщение от ReYalp Посмотреть сообщение
template<typename type1>
test(const test1<type1> & obj) {
type1 obj1 = 5;
std::cout << obj1;
int a = 5;
}
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
03.12.2019, 12:31
Цитата Сообщение от ReYalp Посмотреть сообщение
ок,тогда почему я не могу его явно указать?
Потому что если убрать у конструктора темплейт, его больше нельзя указывать

C++
1
void test() {};
я больше не могу писать так

C++
1
test<int>();
Добавлено через 1 минуту
C++
1
2
3
4
5
6
template<typename type1>
test(const test1<type1> & obj) {
type1 obj1 = 5;
std::cout << obj1;
int a = 5;
}
можно все поменять

C++
1
2
3
4
5
test(const test1<int> & obj) {
int obj1 = 5;
std::cout << obj1;
int a = 5;
}
вот, готово для int (убрали темплейт вообще)
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.12.2019, 13:28
Цитата Сообщение от ReYalp Посмотреть сообщение
просто я взял именно этот пример с написанного уже кода ,который писал сеньйор
и в нем два типа называются одинаково
тут одно из двух:
либо тебе нужно сходить к окулисту.

либо твой "сеньйор" - балбес.

C++
1
2
3
4
5
6
7
8
9
10
template<class t>
struct ololo
{
    template<class t>
    ololo(t&&){}
};
 
int main()
{
}
Code
1
2
3
4
5
6
source_file.cpp:6:14: error: declaration of ‘class t’
     template<class t>
              ^
source_file.cpp:3:10: error:  shadows template parm ‘class t’
 template<class t>
          ^
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.12.2019, 13:28
Помогаю со студенческими работами здесь

Visual Studio выдаёт ошибку при вынесении объявления функции с template в .h файл. Без template всё работает
Проект содержит три файла: Source.cpp, arrTreat.h, arrTreat.cpp. Source.cpp: #include &lt;iostream&gt; using std::cout; using...

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

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

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

Ошибка компиляции: template-id does not match any template declaration
Здравствуйте. Помогите, пожалуйста: #include &lt;iostream&gt; using namespace std; template &lt;typename T&gt; T maxn(T*, const int*); ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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