Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
37 / 31 / 5
Регистрация: 30.04.2014
Сообщений: 1,037

nullptr в шаблоне (template)

07.12.2022, 14:08. Показов 1110. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется шаблонная функция

C++
1
2
3
4
template <typename T, typename S> typename T FuncImp(T& a, S& b)
{
...
}
И вызывающие её функции

C++
1
2
3
4
FuncA(int& r, int& s)
{
    return FuncImp(r, s);
}
C++
1
2
3
4
FuncB(int& r)
{
    return FuncImp(r, nullptr);
}
Естественно, вторая функция не компилится. Хотя, к примеру, по логике, всё работает. Что можно сделать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.12.2022, 14:08
Ответы с готовыми решениями:

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

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

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

15
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
07.12.2022, 14:18
Khludenkov, можно использовать указатели.
0
37 / 31 / 5
Регистрация: 30.04.2014
Сообщений: 1,037
07.12.2022, 14:20  [ТС]
DrOffset, не совсем понял. Ссылки менять на указатели?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
07.12.2022, 14:22
Khludenkov, ну nullptr обозначает нулевой указатель, вы принимаете ссылки. Очевидным образом напрашивается вывод, что если вы хотите использовать nullptr в таком контексте, то ссылки вам не подходят, нужно заменить их на указатели.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
07.12.2022, 14:32
Khludenkov, так а какой логики вы ожидаете от передачи nullptr?
ссылки появились в С++ после языка С, где были только указатели
специально, чтобы оградить функции, которые по своей логике не должны работать
с неинициализированными или нулевыми указателями от ошибок неправильного их использования

специально, чтобы на этапе компиляции отсеивались проблемы вроде этой
C++
1
2
3
4
5
6
void add(int* ptr) {
  ++(*ptr);
}
int main(){
   add(NULL);
}
очевидно, ваша функция FuncImp из этого же теста. Она чего-то хочет записать в a и b!
Зачем вы хотите чтобы она на месте a и b записывала что-то в NULL?
Это крашнет программу и компилятор этого не даёт вам сделать!
0
37 / 31 / 5
Регистрация: 30.04.2014
Сообщений: 1,037
07.12.2022, 14:41  [ТС]
Kuzia domovenok, там проверка. если *b = nullptr, то он не используется в расчётах.

Добавлено через 1 минуту
переделал ссылки на указатели.
то же самое.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
07.12.2022, 14:43
Цитата Сообщение от Khludenkov Посмотреть сообщение
то же самое.
Ну значит что-то неправильно переделали.
Показывайте, тут же нет телепатов.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
07.12.2022, 14:46
C++
1
2
std::nullptr_t p = nullptr;
return FuncImp(r, p);
должно решить проблему

Добавлено через 2 минуты
и здесь typename T FuncImp
typename лишнее
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
07.12.2022, 15:50
Цитата Сообщение от Khludenkov Посмотреть сообщение
FuncA(int& r, int& s)
{
    return FuncImp(r, s);
}
Без возвращаемого значения оно и не должно компилироваться. Что написал компилятор?
И да, nullptr это литерал преобразуемый к типу любого указателя, но нельзя требовать чтобы он конвертировался во что-то ещё.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
07.12.2022, 16:39
Цитата Сообщение от Khludenkov Посмотреть сообщение
Что можно сделать?
C++
1
2
3
4
5
6
7
8
template <typename T, typename S> 
T FuncImp(T& a, S&&) { return a; }
 
int FuncA(int& r, int& s) { return FuncImp(r, s); }
 
int FuncB(int& r){ return FuncImp(r, nullptr); }
 
int main(){}
0
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
07.12.2022, 18:15
Надо использовать вариативные шаблоны
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template<typename ...Args>
auto funcImpl(Args&... args) {
   if constexpr(sizeof... (args) == 1) {
       auto [a] = std::tuple<Args&...>{args...};
       // Работаем с a   
   } else {
       auto [a, b] = std::tuple<Args&...>{args...};
       // Работаем с a и b
   }
}
 
auto funcA(int& r, int& s) {
    return funcImpl(r, s);
}
 
auto funcB(int& r) {
    return funcImpl(r);
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,227
07.12.2022, 19:34
Цитата Сообщение от Khludenkov Посмотреть сообщение
Хотя, к примеру, по логике, всё работает.
Это по какой это "логике"?

Цитата Сообщение от Khludenkov Посмотреть сообщение
Там проверка. если *b = nullptr, то он не используется в расчётах.
Это как это? О каком *b может вообще идти речь, когда b - не указатель?


nullptr в С++ - это не указатель, это литерал типа std::nullptr_t. Каким образом вы собрались привязывать неконстантную ссылку к литералу? И в любом случае, у типа std::nullptr_t нет оператора *, то есть никакого *b тут быть не может. О чем речь?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
07.12.2022, 20:49
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Каким образом вы собрались привязывать неконстантную ссылку к литералу?
problem?

C++
1
2
3
4
5
6
7
#include <cstddef>
void foo(std::nullptr_t&&) {}
 
int main()
{
    foo(nullptr);
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,227
07.12.2022, 20:52
Цитата Сообщение от hoggy Посмотреть сообщение
void foo(std::nullptr_t&&) {}
Цитата Сообщение от Khludenkov Посмотреть сообщение
template <typename T, typename S> typename T FuncImp(T& a, S& b)
"Найди одно отличие" (с)
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
07.12.2022, 21:29
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
"Найди одно отличие" (с)
не надо никакие отличия искать.

ты вообще следишь за нитью собственного диалога?

ты спросил:
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Каким образом вы собрались привязывать неконстантную ссылку к литералу?
ответ на твой вопрос: руками.

если тебе нужно привязать неконстантную ссылку к литералу,
то просто берешь, и руками пишешь код,
в котором неконстантная ссылка привязывается к литералу.
ничего сложного в этом нет.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,227
07.12.2022, 21:40
Цитата Сообщение от hoggy Посмотреть сообщение
не надо никакие отличия искать.
"Надо, Федя, надо" (с)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.12.2022, 21:40
Помогаю со студенческими работами здесь

Ошибка компиляции: 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*); ...

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

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

Error during template rendering In template C:\Python\Django 3\samplesite\bboard\templates\layout\basic.html, error at
Пишу сайт на Django по книги Дронова. Использую Django 3.0. И в главе 2.7 &quot;Наследование шаблонов&quot; вылезает ошибка: Error during...

Ошибка с django.Template.Template
Из учебника djbook: http://djbook.ru/ch04s02.html В самом начале представлен пример использования шаблонов: &gt;&gt;&gt; from django...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
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. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru