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

In template: no viable overloaded '='

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

Author24 — интернет-сервис помощи студентам
У меня следующий код
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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 =...

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

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

4
фрилансер
5497 / 5093 / 1047
Регистрация: 11.10.2019
Сообщений: 13,337
01.07.2021, 21:24 2
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Эксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,057
06.07.2021, 19:16 3
Цитата Сообщение от 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
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
08.07.2021, 22:39 4
kamewek, есть стандартный класс std::type_index (начиная с С++11). Он как раз для таких целей вместо std::type_info.
1
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,057
08.07.2021, 23:38 5
Цитата Сообщение от 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
08.07.2021, 23:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.07.2021, 23:38
Помогаю со студенческими работами здесь

'MyQueue' : use of class template requires template argument list
Написал код про шаблоны. Не могу понять почему выводит ошибку во время наследования класса. ошибки...

В чем различие template <typename T> от template <class T> ?
Добрый день ! Заметил в новых книгах применение записи template &lt;typename T&gt; вместо template...

Ошибка компиляции: template-id does not match any template declaration
Здравствуйте. Помогите, пожалуйста: #include &lt;iostream&gt; using namespace std; template...

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

MSVC и template template classes
Приветствую. Как в MSVC передать template template класс? Простой пример ...

Ошибка с django.Template.Template
Из учебника djbook: http://djbook.ru/ch04s02.html В самом начале представлен пример использования...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru