Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
 Аватар для Shagg
0 / 0 / 0
Регистрация: 03.11.2008
Сообщений: 7

Could not deduce template argument

14.04.2009, 08:03. Показов 4466. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не могу понять что происходит. Имеется код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
typedef bool (compare_function)(const void *a, const void *b);
template <class T> bool is_equal(const void *a, const void *b)
{
  return (*(T*)a == *(T*)b);
}
 
int main()
{
    compare_function *equality_checker;
    equality_checker = &is_equal<int>;
    return 0;
}
(Вырезано из класса, менять который нельзя) В C++Builder 6 компилится на ура, а Visual C++ 6, выдает такие ошибки:
Code
1
2
3
4
5
C:\Projects\test\main.cpp(10) : error C2783: 'bool __cdecl is_equal(const void *,const void *)' : could not deduce template argument for 'T'
C:\Projects\test\main.cpp(10) : error C2563: mismatch in formal parameter list
C:\Projects\test\main.cpp(10) : error C2568: '=' : unable to resolve function overload
        could be 'bool __cdecl is_equal(const void *,const void *)'
        C:\Projects\test\main.cpp(2) : see declaration of 'is_equal'
Что делать? Куда копать???
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.04.2009, 08:03
Ответы с готовыми решениями:

Ошибка: error C2783: 'T __cdecl sumF(void)' : could not deduce template argument for 'T'
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int a; template&lt; typename T &gt; T sumF() { T s=0; ...

Ошибки: 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...

12
 Аватар для Шерсть-На-Носу
48 / 48 / 8
Регистрация: 30.01.2009
Сообщений: 168
19.04.2009, 23:51
В чем именно здесь ошибка, я не понял. Также я не понял, зачем здесь вообще шаблон функции? Сделай вот так:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
typedef bool (compare_function)(const void *a, const void *b);
 
bool is_equal(const void *a, const void *b)
{
  return (a == b);
}
 
int main()
{
    compare_function *equality_checker;
    equality_checker = &is_equal;
    return 0;
}
Добавлено через 59 минут 58 секунд
Ерунду, конечно, написал Но зачем нужен этот шаблон и правда непонятно. Он же просто дублирует сравнение двух переменных.
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
20.04.2009, 02:08
Такой шаблон некорректен,поскольку в списке параметров нету типа T. Компилятор не может определить,к какому типу приводить указатели. Фактически, таким шаблоном ты приказываешь компилятору перегружать функцию, оставляя неизменным список параметров.

Задавать шаблон нужно было так :
Code
1
2
3
4
template <class T>
bool compare_func( T & a,T & b) {
   return a==b;     
};
Впрочем,такая функция вообще никому не нужна))

P.S под словами "ты делаешь то-то-то" я не обращаюсь к тебе лично,просто так объясняю,что происходит.
0
 Аватар для Shagg
0 / 0 / 0
Регистрация: 03.11.2008
Сообщений: 7
20.04.2009, 06: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
typedef bool (compare_function)(const void *a, const void *b);
template <class T> bool is_equal(const void *a, const void *b)
{
  return (*(T*)a == *(T*)b);
}
template<class T> class array {
public:
....members
  compare_function *equality_checker;
  array() {
    ....
    equality_checker = &is_equal<T>;
  }
  unsigned long indexof(const T a, unsigned long startindex = 0, unsigned long endindex = 0)
  {
    unsigned long i;
    if (endindex)
     { for(i=startindex; i<=endindex; i++) if (equality_checker(&data[i], &a)) return i; }
    else
     { for(i=startindex; i<count; i++) if (equality_checker(&data[i], &a)) return i; }
    return count;
  }
}
А функция is_equal здесь является просто функцией сравнения по-умолчанию. Я не спрашиваю, надо это или не надо. Вопрос в том, почему C++Builder 6 это все съедает, а VC 6 ругается. А на счет корректности шаблона, тут вы не правы. Стандарт не предписывает обязательности присутствия параметра шаблона в списке аргументов функции, так как спецификация шаблона всегда указывается после имени функции, например: is_equal<int>
2 Шерсть-На-Носу: батенька, посмотрите на свой код и извинитесь, вы сравниваете указатели а не значения
0
 Аватар для Шерсть-На-Носу
48 / 48 / 8
Регистрация: 30.01.2009
Сообщений: 168
20.04.2009, 08:15
Ерунду, конечно, написал
Это и было мое извинение
0
 Аватар для Shagg
0 / 0 / 0
Регистрация: 03.11.2008
Сообщений: 7
20.04.2009, 08:29  [ТС]
Цитата Сообщение от Шерсть-На-Носу Посмотреть сообщение
Это и было мое извинение
хмм... а зачем тогда писать, если твой пост заведомо ничем не поможет?
И тем не менее, проблема остается. Чтото мне кажется что вся проблема в самом VC 6, так как подобные конструкции допускаются стандартом. Большая просьба сюда входящим, скомпилить код из первого поста на более поздних версиях VC. Буду весьма признателен.
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
20.04.2009, 09:18
Цитата Сообщение от Shagg Посмотреть сообщение
хмм... а зачем тогда писать, если твой пост заведомо ничем не поможет?
И тем не менее, проблема остается. Чтото мне кажется что вся проблема в самом VC 6, так как подобные конструкции допускаются стандартом. Большая просьба сюда входящим, скомпилить код из первого поста на более поздних версиях VC. Буду весьма признателен.

Посмотрел стандарт - действительно,так делать можно. В VC6 есть и другие несоответствия стандарту,ничего не поделать. В более поздних версиях ( у меня 2008) компилируется.

P.S все же остаюсь при своем мнении - решение не удачное,так писать не стоит. Если это хоть как-нибудь возможно - там стоит поставить ссылочный тип или хотя бы указатель соответствующего типа.
0
 Аватар для Shagg
0 / 0 / 0
Регистрация: 03.11.2008
Сообщений: 7
20.04.2009, 09:31  [ТС]
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
Посмотрел стандарт - действительно,так делать можно. В VC6 есть и другие несоответствия стандарту,ничего не поделать. В более поздних версиях ( у меня 2008) компилируется.

P.S все же остаюсь при своем мнении - решение не удачное,так писать не стоит. Если это хоть как-нибудь возможно - там стоит поставить ссылочный тип или хотя бы указатель соответствующего типа.
Эххх... Дай боже здоровья мелкомягким, когда до них наши программеры доберутся
Значит это один из тех редких случаев, когда виноват все таки компилятор.
Спасибо за помощь, тема закрыта.
0
 Аватар для Шерсть-На-Носу
48 / 48 / 8
Регистрация: 30.01.2009
Сообщений: 168
20.04.2009, 20:31
Шаблон функции есть ничто иное как упрощенная запись нескольких перегруженных функций. А они ОБЯЗАТЕЛЬНО должны иметь разные типы или количество параметров. Поэтому вышеописанный шаблон функции - нонсенс. При всем моем уважении.
0
 Аватар для Shagg
0 / 0 / 0
Регистрация: 03.11.2008
Сообщений: 7
23.04.2009, 06:25  [ТС]
Цитата Сообщение от Шерсть-На-Носу Посмотреть сообщение
Шаблон функции есть ничто иное как упрощенная запись нескольких перегруженных функций. А они ОБЯЗАТЕЛЬНО должны иметь разные типы или количество параметров. Поэтому вышеописанный шаблон функции - нонсенс. При всем моем уважении.
Знаете, как меня достали такие умники, которые указывают откуда у меня руки растут
В свое время инкапсуляция функций в структуры данных тоже была нонсенсом и тщательно высмеивалась. А ШАБЛОН ФУНКЦИИ и ПЕРЕГРУЗКА ФУНКЦИИ - не совсем одно и тоже, так как перегруженные функции различаются ТИПОМ И КОЛИЧЕСТВОМ ПЕРЕДАВАЕМЫХ ЗНАЧЕНИЙ И ТИПОМ ВОЗВРАЩАЕМОГО ЗНАЧЕНИЯ, в то время как шаблонные функции имеют ОДИНАКОВУЮ СИГНАТУРУ для всех типов данных. Читайте литературу, господа, и повнимательнее.
PS: нестандартный подход, не значит неправильный подход
0
0 / 0 / 0
Регистрация: 12.12.2008
Сообщений: 18
23.04.2009, 08:03
Цитата Сообщение от Shagg Посмотреть сообщение
ТИПОМ ВОЗВРАЩАЕМОГО ЗНАЧЕНИЯ
Вот это не верно.
0
 Аватар для Шерсть-На-Носу
48 / 48 / 8
Регистрация: 30.01.2009
Сообщений: 168
23.04.2009, 08:41
И это все? По делу - малословно...
А эту тему мне хотелось бы развить.
Прошу у модераторов прощенья,
Но у меня сегодня настроение флудить.

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

Вопрос "Кто виноват?" оставим мы в покое,
Не станем дьявола мы всуе поминать.
Давайте порешим, что можно сделать,
Чтобы потомкам не пришлось нас проклинать.

Подумайте о тех, кто будет после,
Кто будет наши закорючки разбирать.
Давайте пожалеем бедных деток?
Им еще нужно будет Родину спасать.

Наличие возможности в стандарте
Нам в качестве рекомендации дано.
Давайте скажем хором: "Здравый смысл!".
Давайте будем опираться на него?
0
 Аватар для Shagg
0 / 0 / 0
Регистрация: 03.11.2008
Сообщений: 7
23.04.2009, 09:52  [ТС]
Модеры, закройте тему. Проблема уже выяснена. Всех собак откопали.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.04.2009, 09:52
Помогаю со студенческими работами здесь

Friend template class with template class argument
Помогите подружить 2 класса: Имеется класс Student: template &lt;class _T&gt; class Faculty; class Student{ friend...

Error: '>>' should be '>>' within a nested template argument list
кто знает че за ошибка, как с ней бороться? 000615.cpp: In function 'int main()':

Ошибка E2396 Template argument must be a constant expression
Нужна помощь профессионала. Есть такой код class TMySet { public: TMySet(const int &amp;AMin, const int &amp;AMax, const int...

Шаблоны: ошибки: requires template argument list или undeclared identifier
Есть маленький тестовый проект из 4-файлов. Что мне надо - рассказывать словами замучаюсь, взляните пожалуйста на код по ссылке ниже (он...

Ошибка no instance of function template "Swap" matches the argument list
#include &quot;stdafx.h&quot; using namespace System; using namespace System::Collections::Generic; generic &lt;typename T&gt; void Swap(T...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru