|
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
|
||||||||||||||||
Call of overloaded template function is ambiguous22.12.2016, 22:31. Показов 7681. Ответов 14
Метки нет (Все метки)
Добрый вечер.
Есть два метода:
Я не понял, что ему не ясно? Второй параметр шаблона - число (а не булево значение). Значит все должно определяться однозначно. Удалить второй метод и записать первый с uint8_t count = sizeof(T) не очень хотелось бы.
0
|
||||||||||||||||
| 22.12.2016, 22:31 | |
|
Ответы с готовыми решениями:
14
Ambiguous call to overloaded function Error: call of overloaded ‘Function’ is ambiguous 'sqrt' : ambiguous call to overloaded function |
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
| 22.12.2016, 22:33 | |
|
[progeR], разве "по умолчанию" может быть не в конце?
0
|
|
|
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
|
||||||
| 22.12.2016, 22:41 [ТС] | ||||||
0
|
||||||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
| 22.12.2016, 22:55 | |
|
[progeR], я тихо спросил?
0
|
|
|
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
|
||||||
| 23.12.2016, 04:02 | ||||||
|
работает, правда не знаю как грамотно в forward эти auto&& засунуть при передаче во второй функции:
0
|
||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 23.12.2016, 12:00 | |||||||
|
смотрите: тип параметров выводятся автоматически из аргументов с которыми была запущена функция. ну то есть первые два были указаны явно. следующие прошли как по умолчанию, а последние вывелись из аргументов запуска функции)) косяк же приключился потому, что значение интегральной константы 3U может кастиццо и в int8_t, и в bool. компилятор как бы не телепат, во что именно предполагается каст. фишка в том, что даже если бы каста не было, всё равно компилятор бы затупил: http://rextester.com/PHRU21941
почему компиляется первый test (причем через жёпь), и не работает второй кастую DrOffset в тред
1
|
|||||||
|
Вездепух
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,178
|
|||||||
| 23.12.2016, 12:45 | |||||||
Сообщение было отмечено hoggy как решение
РешениеНасколько же хорошо типы нетиповых (non-type) аргументов шаблона соответствуют типам нетиповых параметров шаблона значения не имеет и никогда не имело. И на overload resolution это никакого влияния не оказывает. В С++ нет механизма "предпочтения" тех или иных версий перегруженного шаблона на основе того, как "хорошо" совпадали типы шаблонных аргументов. Компилятор интересует лишь то, является ли аргумент допустимым для данного параметра. Все, что компилятор должен сделать - это нагенерировать из ваших шаблонов набор функций-кандидатов, к которым потом будет применяться overload resolution. Все что для этого надо - это чтобы шаблон функции успешно специализировался. Если нетиповой параметр шаблона является целочисленным значением, то любой целочисленный аргумент, который не требует сужающего преобразования (narrowing conversion) является допустимым аргументом шаблона. Так как преобразование unsigned -> bool формально не является сужающим, ваш второй шаблон тоже успешно включается в рассмотрение.Я бы даже сказал, что существует больше риска того, что ваш первый шаблон будет исключен из рассмотрения, ибо преобразование unsigned -> uint8_t в общем случае может быть сужающим. Но для явной константы 3U сужения нет, поэтому первый шаблон был допущен к рассмотрению.--- Но это еще пол-дела. Даже если бы в С++ существовал некий механизм мета-overload resolution, рассматривающий на нетиповые параметрах шаблонов, у вас бы все равно сохранилась неоднозначность. Точного соответствия-то у вас нет. Для первого шаблона требуется преобразование unsigned -> uint8_t, а для второго unsigned -> bool. Эти преобразования обладают одинаковым рангом и приводят к неоднозначности, как в таком простом примере
2
|
|||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 23.12.2016, 12:55 | ||
|
sizeof(uint8_t) - 1 тут в обоих случаях получается сужающий каст. почему был выбран bool ?
0
|
||
|
Вездепух
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,178
|
||||
| 23.12.2016, 13:14 | ||||
Сообщение было отмечено hoggy как решение
РешениеПервый шаблон даже отдаленно не подходит, ибо типовой аргумент int никак не может быть передан через нетиповой параметр bool wait. Остается только второй шаблон. Все.Поправка: Тут я не прав. Первый вызов не должен компилироваться из-за сужающей конверсиии (см. ниже). Добавлено через 12 минут unsigned -> bool действительно является сужающей. Допускание такой конверсии в разных контекстах - баги в GCC и clang https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57891 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65043 https://llvm.org/bugs/show_bug.cgi?id=22566#c1 В clang, пишут, исправили (не знаю, везде ли). Что же касается преобразования unsigned -> uint8_t, то оно формально не является сужающим, если исходное значение - константа, помещающаяся в uint8_t.То есть в случае ТС действительно имеет место безобразие с некоторыми компиляторами, допускающими сужающую конверсию в тех контекстах, когда она запрещена.
2
|
||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||
| 23.12.2016, 13:22 | |||||
|
uint8_t - это unsigned char по мнению одного из gcc у него такой же размер, как у буля. test<int32_t, 3,цыферка 3 - обычный int. её придется кастить либо у 1 байтовому булю, либо к 1 байтовому чару. в обоих случаях размер сжимается. почему именно буль? но никак не объясняет ситуацию с первым тестом. Добавлено через 6 минут прочел дополнение. теперь все понятно. спасибо))
0
|
|||||
|
Вездепух
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,178
|
|||||||
| 23.12.2016, 13:24 | |||||||
<typename, uint8_t, bool, bool, typename, typename>, то есть <тип, значение, значение, значение, тип, тип>Вы же в ваших вызовах
<тип, значение, значение, тип, тип>Это никак не может подойти к первому шаблону. Поэтому первый шаблон в ваших вызовах вообще отбрасывается сразу и более не рассматривается. Рассматривается только второй шаблон. У него параметры <typename, bool, bool, typename, typename>.При этом первый вызов формально неверен из-за сужающего преобразования значения 3 к типу bool, но из-за бага в компиляторе он проходит. А во втором вызове проблем нет.
1
|
|||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 23.12.2016, 13:32 | |
|
0
|
|
|
Вездепух
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,178
|
|||||||||||
| 23.12.2016, 13:44 | |||||||||||
|
Код ТС:
http://coliru.stacked-crooked.... 2c62493b19 А GCC до сих пор глючит http://coliru.stacked-crooked.... 41e25acd46 Добавлено через 5 минут Visual Studio 2015 в ответ на код
3
|
|||||||||||
| 23.12.2016, 15:59 | |
|
0
|
|
|
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
|
||||||
| 23.12.2016, 22:22 | ||||||
|
Не по теме: notAll, все-таки вроде так:
Добавлено через 7 минут Не по теме: хотя не, с константами проблема
0
|
||||||
| 23.12.2016, 22:22 | |
|
Помогаю со студенческими работами здесь
15
Ошибка: ('sqrt' : ambiguous call to overloaded function) Error C2668: 'sqrt' : ambiguous call to overloaded function Ambiguous access to overloaded function Abiguous call to overloaded function Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|