Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1

Исправить ошибку в коде из книги

03.12.2020, 10:46. Показов 1413. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
#pragma once
 
#include <cstddef>
#include <array>
 
template <typename T, std::size_t N>
struct DotProductT
{
    static inline T Result(T const * a, T const * b)
    {
        return *a * *b + DotProductT<T, N - 1>::Result(a + 1, b + 1);
    }
};
 
template <typename T>
struct DotProductT <T, 0>
{
    static inline T Result(T const *, T const *)
    {
        return T{};
    }
};
 
template <typename T, std::size_t N>
auto DotProduct(std::array<T, N> const & x,
                std::array<T, N> const & y)
{
    return DotProductT<T, N>::Result(x.begin(), y.begin() )
    // return DotProductT<T, N>::Result(&*x.begin(), &*y.begin() );
}
Есть в книжке данный код, не закомментированная версия вызывает ошибку преобразования:
Ошибка C2664 "T DotProductT<T,3>::Result(const T *,const T *)": невозможно преобразовать аргумент 1 из "std::_Array_const_iterator<_Ty,3>" в "const T *".

я исправил на закомментированную версию.
Вопрос, можно ли как то по умней ее исправить?

книга - "Шаблоны C++. Справочник разработчика | Джосаттис Николаи М., Грегор Дуглас"
23.1.3. Гибридное метапрограммирование

Добавлено через 5 минут
еще вот вариант (заменить):
C++
1
2
3
4
5
template <typename T, std::size_t N>
auto DotProduct(T (&x)[N], T (&y)[N] )
{
    return DotProductT<T, N>::Result(x, y);
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.12.2020, 10:46
Ответы с готовыми решениями:

Найти и исправить ошибку в коде с пузырьковой сортировкой (пример из книги Шилдта)
программа сортировки массива пузырьковым методом из книги Шилдта. компилятор на 15, 18, 24, 26, 27, 28, 36 пишет ошибка invalid types...

В коде выдает ошибку на 15 строчке. Мне надо исправить эту ошибку
procedure TForm1.BOkClick(Sender: TObject); var e1, e2: double; begin Label1.Caption := ''; if not...

Как исправить исправить ошибку в коде
Здравствуйте,помогите пожалуйста исправить ошибку в коде.using System; using System.Threading; namespace Gorokhov_2 { class...

11
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
03.12.2020, 10:54
Цитата Сообщение от _stanislav Посмотреть сообщение
Есть в книжке данный код, не закомментированная версия вызывает ошибку преобразования:
Ошибка C2664 "T DotProductT<T,3>::Result(const T *,const T *)": невозможно преобразовать аргумент 1 из "std::_Array_const_iterator<_Ty,3>" в "const T *".
Лучше делать вот так
C++
1
 return DotProductT<T, N>::Result(std::to_address(x.begin()), std::to_address(y.begin()));
Добавлено через 3 минуты
Цитата Сообщение от _stanislav Посмотреть сообщение
ще вот вариант (заменить):
Тогда уж
C++
1
2
3
4
5
    template <typename It1, typename It2>
    static inline T Result(It1 a, It2 b)
    {
        return *a * *b + DotProductT<T, N - 1>::Result(a + 1, b + 1);
    }
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
03.12.2020, 10:54  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Что-то у меня не возникает никаой ошибки.
gcc тоже не ругается, не явные преобразования между итераторами и указателями это нормальное поведение кто прав из компиляторов?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
03.12.2020, 10:55
Цитата Сообщение от _stanislav Посмотреть сообщение
gcc тоже не ругается, не явные преобразования между итераторами и указателями это нормальное поведение кто прав из компиляторов?
Не, всё нормально, возникла такая же ошибка, в майкрософте. Неправильно смотрел
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
03.12.2020, 10:59  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Тогда уж
так не будет работать, там N есть
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
03.12.2020, 11:01
Цитата Сообщение от _stanislav Посмотреть сообщение
так не будет работать, там N есть
Он и останется. Проблема возникала с методом Result
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
03.12.2020, 11:05  [ТС]
---
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
03.12.2020, 11:19
Цитата Сообщение от _stanislav Посмотреть сообщение
еще вот вариант (заменить):
C++Выделить код
1
2
3
4
5
template <typename T, std::size_t N>
auto DotProduct(T (&x)[N], T (&y)[N] )
Можно ещё как-то так сделать, будет работать для T[N] и для std::array<T, N>
C++
1
2
3
4
5
6
7
8
template <typename TArray> //requires std::is_array_v<T>
auto DotProduct(TArray &x, TArray &y)
{
    //constexpr size_t N = std::size(std::declval<TArray>());
    constexpr size_t N = sizeof(x) / sizeof(x[0]);
    using T = std::iter_value_t<decltype(std::begin(x))>;
    return DotProductT<T, N>::Result(std::begin(x), std::begin(y));
}
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
03.12.2020, 11:21
Цитата Сообщение от _stanislav Посмотреть сообщение
Есть в книжке данный код, не закомментированная версия вызывает ошибку преобразования:
В книге действительно написан бред.

Цитата Сообщение от _stanislav Посмотреть сообщение
не явные преобразования между итераторами и указателями это нормальное поведение
Неявные преобразования? Это где это "это нормальное поведение"??? Нет таких преобразований вообще и никогда не было.

Цитата Сообщение от _stanislav Посмотреть сообщение
Вопрос, можно ли как то по умней ее исправить?
Например, перевести функцию Result на итераторы вместо указателей

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
template <typename T, std::size_t N>
struct DotProductT
{
    static inline auto Result(T a, T b) -> decltype (*a * *b)
    {
        return *a * *b + DotProductT<T, N - 1>::Result(a + 1, b + 1);
    }
};
 
template <typename T>
struct DotProductT <T, 0>
{
    static inline auto Result(T a, T b) -> decltype (*a * *b)
    {
        return {};
    }
};
 
template <typename T, std::size_t N>
auto DotProduct(std::array<T, N> const & x,
                std::array<T, N> const & y)
{
    return DotProductT<T, N>::Result(x.begin(), y.begin());
}
Сама идея перехода к указателям в данном случае является невероятно глупой. Данному алгоритму не нужен произвольный доступ, по каковой причине разумно было бы реализовать его именно без навязывания требования произвольного доступа. А переход к указателям нарушает эти соображения. Приведенный мною вариант будет, например, работать и с парой std::list.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
03.12.2020, 11:36  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Нет таких преобразований вообще и никогда не было.
а какие есть?

Добавлено через 5 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Приведенный мною вариант будет, например, работать
не работает https://wandbox.org/permlink/tQzE8U9LWFiIiui2
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
03.12.2020, 11:42
Лучший ответ Сообщение было отмечено _stanislav как решение

Решение

Цитата Сообщение от _stanislav Посмотреть сообщение
не работает
ОК, не довел начатое до конца. Правильно так

C++
1
2
3
4
5
6
template <typename T, std::size_t N>
auto DotProduct(std::array<T, N> const & x,
                std::array<T, N> const & y)
{
    return DotProductT<typename std::array<T, N>::const_iterator, N>::Result(x.begin(), y.begin());
}
Можно даже сделать параметр T дедуцируемым, перенеся его на метод

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
template <std::size_t N>
struct DotProductT
{
    template <typename T> static inline auto Result(T a, T b) -> decltype (*a * *b)
    {
        return *a * *b + DotProductT<N - 1>::Result(a + 1, b + 1);
    }
};
 
template <>
struct DotProductT <0>
{
    template <typename T> static inline auto Result(T a, T b) -> decltype (*a * *b)
    {
        return {};
    }
};
 
template <typename T, std::size_t N>
auto DotProduct(std::array<T, N> const & x,
                std::array<T, N> const & y)
{
    return DotProductT<N>::Result(x.begin(), y.begin());
}
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
03.12.2020, 11:47  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Сама идея перехода к указателям в данном случае является невероятно глупой.
кстати в книге написано:

Однако с дидактическими целями перепишем реализацию нашего шаблона
dotProduct () так, чтобы избежать цикла...


Добавлено через 3 минуты
вероятно что бы не усложнять решили указателями воспользоваться
TheCalligrapher, в твой код с первого раза не просто въехать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.12.2020, 11:47
Помогаю со студенческими работами здесь

Не могу определить ошибку в коде. Написано все с книги
Написал код с книги, перепроверил. Xcode ругается, проверил в онлайн компиляторе, ошибка такая: :(.text.startup+0x1bb): undefined reference...

Пример книги Сандера (контроллер): найти ошибку в коде
Доброго времени суток. Вот пытаюсь сделать пример из книги Сандерса &quot;ASP.NET Mvc framework &quot; во возникла такая проблемка : ...

исправить ошибку в коде
мне вот недавно скинули программу, только она не работает, ругается на &quot;выражение должно иметь тип класса&quot;. не могу понять и вообще...

Исправить ошибку в коде
я пачти все сделал вот тока в одном месте ашипка( в 16 строке) че не так? procedure TForm1.Button1Click(Sender: TObject); ...

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


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

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