С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/30: Рейтинг темы: голосов - 30, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 01.11.2019
Сообщений: 16

In template: no viable overloaded '='

01.07.2021, 19:43. Показов 5943. Ответов 4
Метки c++, ecs (Все метки)

Студворк — интернет-сервис помощи студентам
У меня следующий код
C++
1
2
3
4
5
template<typename Component, typename... Args>
  Entity* Add(Args&&... args) {
    components[typeid(Component)] = std::make_unique<Component>(std::forward<Args>(args)...);
    return this;
  }
Функция из движка ECS паттерна.

При попытке указать какую то значение или переменную получаю ошибку " In template: no viable overloaded '=' ".
C++
1
2
3
4
5
6
7
void GameScene::OnCreate() {
    {
        auto player = engine.GetEntityManager()->CreateEntity();
        player->Add<MoveComponent>(&speed);
        player->Add<HealthComponent>(30);
    }
}
Сам код в котором я пытаюсь создать сущность из компонентов.
Подскажите в чем моя ошибка?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.07.2021, 19:43
Ответы с готовыми решениями:

error: no viable overloaded '+=
Здравствуйте, подскажите пожалуйста почему не работает оператор +=, операторы + и остальные вроде работают без ошибок ,не получается самому...

Call of overloaded template function is ambiguous
Добрый вечер. Есть два метода: template&lt;typename T, uint8_t count, bool msb = true, bool wait = true, typename U1, typename U2&gt; ...

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

4
фрилансер
 Аватар для Алексей1153
6445 / 5640 / 1128
Регистрация: 11.10.2019
Сообщений: 15,007
01.07.2021, 21:24
kamewek, вот так получается

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
31
32
33
34
35
36
37
38
#include <memory>
#include <map>
#include <string>
 
struct AbstractComponent
{
    virtual ~AbstractComponent()=default;
};
 
struct MoveComponent:public AbstractComponent
{
    MoveComponent(int i){}
};
 
struct HealthComponent:public AbstractComponent
{
    HealthComponent(int i,int n){}
};
 
struct container
{
    std::map<std::string,std::unique_ptr<AbstractComponent>> components;
    
    template<typename Component, typename... Args>
    void Add(Args&&... args)
    {
        components[typeid(Component).name()] = std::make_unique<Component>(std::forward<Args>(args)...);
    }
};
 
int main()
{
    container c;
    c.Add<MoveComponent>(10);
    c.Add<HealthComponent>(20,30);
 
    return 0;
}
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1819
Регистрация: 18.10.2014
Сообщений: 17,202
06.07.2021, 19:16
Цитата Сообщение от kamewek Посмотреть сообщение
У меня следующий код
C++
1
2
3
4
5
template<typename Component, typename... Args>
  Entity* Add(Args&&... args) {
    components[typeid(Component)] = std::make_unique<Component>(std::forward<Args>(args)...);
    return this;
  }
Функция из движка ECS паттерна.
Эта функция неработоспособна. Что такое "движок ECS паттерна"? Кто писал этот "движок"?

Точнее, эта функция может быть работоспособной, но только при правильном components. А у вас - неправильный.

Где объявление components? Почему вы не привели его в вопросе?

Добавлено через 32 минуты
Цитата Сообщение от Алексей1153 Посмотреть сообщение
components[typeid(Component).name()]
Нет, использовать имя в качестве ключа не допускается - никаких гарантий по поводу имени не дается.

Класс std::type_info сам по себе уже прекрасно подготовлен для использования в качестве ключа (см. before, hash_code и операторы сравнения на равенство). Надо только написать соответствующие функторы сравнения для контейнера. И помнить, что std::type_info некопируем, т.е. хранить нужно указатели или ссылки, а не копии.
1
611 / 416 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
08.07.2021, 22:39
kamewek, есть стандартный класс std::type_index (начиная с С++11). Он как раз для таких целей вместо std::type_info.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1819
Регистрация: 18.10.2014
Сообщений: 17,202
08.07.2021, 23:38
Цитата Сообщение от jugu Посмотреть сообщение
есть стандартный класс std::type_index (начиная с С++11). Он как раз для таких целей вместо std::type_info.
... и, учитывая, что std::type_index является неявно преобразовываемым из std::type_info, изначальный вариант кода может быть "спасен" просто путем указания std::type_index в качестве ключевого типа в map.

Альтернативный вариант, который я имел в виду в своем ответе - это указание std::reference_wrapper<std::type_info> в качестве ключевого типа. Но тогда придется самому дописывать функторы сравнения или хеширования...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.07.2021, 23:38
Помогаю со студенческими работами здесь

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

'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*); ...

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru