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

In template: no viable overloaded '='

01.07.2021, 19:43. Показов 6005. Ответов 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
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,105
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
12944 / 6811 / 1821
Регистрация: 18.10.2014
Сообщений: 17,236
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
12944 / 6811 / 1821
Регистрация: 18.10.2014
Сообщений: 17,236
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
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru