Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182

Операторы-шаблоны в классах-шаблонах

26.06.2020, 18:43. Показов 1846. Ответов 6

Студворк — интернет-сервис помощи студентам
Добрый вечер!

Помогите, пожалуйста, разобраться.

Есть следующие классы:

State.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// State.h
#include "Engine.h"
 
namepsace Engine{
template<typename T>
    class State{
    private:
        T a;
        T c;
    public:
        // ...
        template<typename R>
        const State<T>& operator+=( const R& v )const{ c += v; return *this;
        // ...
    }
}

coarlsimple.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// coralsimple.h
 
namespace Coral{
    namespace Simple{
        template<class T>
        class Value{
        private:
            // ...
        public:
            // ...
            template<typename R> void    operator+= ( const R& v ){ Set( Get() + v ); }
            // ...
        };
    }
}

Engine.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Engine.h
#pragma once
#include <vector>
#include <queue>
#include <coralsimple.h>
// ...
 
namespace Engine{
    // ...
    typedef float                      ival;          // ** It's internal type
    typedef int                        rval;          // ** It's type of return value of Attribute
    typedef Coral::Simple::Value<ival> vval;          // ** It's define type of value
    // ...
}


И следующие ошибки:
C2678
C2678 binary '+=': no operator found which takes a left-hand operand of type 'const T' (or there is no acceptable conversion) \state.h


Со следующими сообщениями:
Output
Code
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
2>d:\ solution\projects\battleground\state.h(44): error C2678: binary '+=': no operator found which takes a left-hand operand of type 'const T' (or there is no acceptable conversion)
2>        with
2>        [
2>            T=Engine::vval
2>        ]
2>d:\ solution\projects\coral\coralsimple.h(61): note: could be 'void Coral::Simple::Value<Engine::ival>::operator +=<R>(const R &)'
2>        with
2>        [
2>            R=Engine::ival
2>        ]
2>d:\ solution\projects\coral\coralsimple.h(60): note: or       'Coral::Simple::Value<Engine::ival> Coral::Simple::Value<Engine::ival>::operator +=<R>(const R &)'
2>        with
2>        [
2>            R=Engine::ival
2>        ]
2>d:\ solution\projects\battleground\state.h(44): note: while trying to match the argument list '(const T, const R)'
2>        with
2>        [
2>            T=Engine::vval
2>        ]
2>        and
2>        [
2>            R=Engine::ival
2>        ]
2>d:\ solution\projects\battleground\attributehealth.h(57): note: see reference to function template instantiation 'const Engine::State<Engine::vval> &Engine::State<Engine::vval>::operator +=<Engine::ival>(const R &) const' being compiled
2>        with
2>        [
2>            R=Engine::ival
2>        ]
2>d:\ solution\projects\battleground\attributehealth.h(57): note: see reference to function template instantiation 'const Engine::State<Engine::vval> &Engine::State<Engine::vval>::operator +=<Engine::ival>(const R &) const' being compiled
2>        with
2>        [
2>            R=Engine::ival
2>        ]


Не могу понять в чём проблема, написал подобную конструкцию A<B<int>> в чистом проекте и A<B<int>>operator+=<R> адекватно работает:
Test.cpp
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
// Test.cpp
// ...
 
template<class T>
class A
{
private:
    T a = 0;
public:
    template<typename R>
    const A<T> operator+=( const R& v ){
        a += v;
        return *this;
    }
};
 
template<class T>
class S
{
private:
    T s;
public:
    template<typename R>
    const S<T> operator+=( const R& v ){
        s += v;
        return *this;
    }
};
 
int main(){
    A<int> a;
    a += 10.f;
    S<int> s;
    s += 10.f;
    S<A<int>> q;
    q += 10.f;
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.06.2020, 18:43
Ответы с готовыми решениями:

C++ Шаблоны в классах
main.cpp: #include &quot;A.h&quot; int main() { A&lt;int&gt; object; return 0; } A.h:

Не получается перегрузить операторы больше, меньше + шаблоны
Ругается на метод бинарного дерева template &lt;class T&gt; class Tree { private: Elem&lt;T&gt; *root; //указатель на корневой элемент ...

С++.Операторы в С++: условные операторы, операторы break и continue
Выяснить, пересекаются ли параболы у=аx2+bx+с и у=dx2+ex + f. При положительном ответе найти точки пересечения.

6
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.06.2020, 19:27
----
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
26.06.2020, 19:28
Лучший ответ Сообщение было отмечено Eraston как решение

Решение

oleg-m1973, может наоборот const-то убрать лучше в State? Как-то const противоречит семантике operator+=.
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.06.2020, 19:30
Лучший ответ Сообщение было отмечено Eraston как решение

Решение

Цитата Сообщение от Eraston Посмотреть сообщение
class State{
    private:
        T a;
        T c;
    public:
        // ...
        template<typename R>
        const State<T>& operator+=( const R& v )const{ c += v; return *this;
C++
1
State &operator+=( const R& v ) { c += v; return *this;}
Добавлено через 21 секунду
+= это не константный оператор

Добавлено через 31 секунду
Цитата Сообщение от DrOffset Посмотреть сообщение
oleg-m1973, может наоборот const-то убрать лучше в State? Как-то const противоречит семантике operator+=.
Да, уже поправил
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
26.06.2020, 19:50
Цитата Сообщение от Eraston Посмотреть сообщение
Есть следующие классы:
И как из всего этого мы должны узнать, что за оператор += вы фактически вызываете? Где фактические вызовы? Как нам определить типы операндов?

Цитата Сообщение от Eraston Посмотреть сообщение
Не могу понять в чём проблема, написал подобную конструкцию A<B<int>> в чистом проекте и A<B<int>>operator+=<R> адекватно работает:
Так а где здесь видно, что этот вариант как-то похож на исходный?

По вашим сообщениям об ошибках видно, что проблема скорее всего в том, что вы зачем-то навесили const на ваши операторы +=. В тестовом варианте ничего подобного нет, то есть это совсем не "подобная конструкция". Неудивительно, что тестовый вариант компилируется, а ваш исходный - нет.
1
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
26.06.2020, 19:57  [ТС]
Благодарю

Добавлено через 2 минуты
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
И как из всего этого мы должны узнать, что за оператор += вы фактически вызываете? Где фактические вызовы? Как нам определить типы операндов?
Потому, что компилятор не предоставляет места вызова этих операторов, а найти их в 1000-ах строчек кода уже затруднительно. К слову, пытался понять, где же эти операторы вызываются, но ума не хватает, где именно.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
26.06.2020, 20:03
Цитата Сообщение от Eraston Посмотреть сообщение
Потому, что компилятор не предоставляет места вызова этих операторов,
Два последних сообщения в приведенном вами списке сообщений об ошибках - это и есть места вызова этих операторов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.06.2020, 20:03
Помогаю со студенческими работами здесь

Определить какие из имён встречаются во всех классах, только в некоторых классах, не встречаются ни в одном
1. Заданный имена девочек . Определить , какие из этих имён встречаются во всех классах данной параллели , которые есть только в некоторых...

Определить, какие из этих имен встречаются во всех классах, какие есть хотя бы в двух классах, и какие - только в одном классе
Для каждого из четырех классов указаны имена девочек, обучающихся в них. Определить, какие из этих имен встречаются во всех классах, какие...

Хранить шаблоны документов в базе и выводить данные в эти шаблоны
Доброго времени суток. Интересует вопрос: мне необходимо формировать вордовские документы по шаблону. У меня создан шаблон документа...

Заданы имена девочек. Определить, какие встречаются во всех классах, которые есть только в некоторых классах и какие не встречаются
Заданы имена девочек. Определить, какие из этих имен встречаются во всех классах данной параллели, которые есть только в некоторых классах...

Чем отличаются шаблоны HTML и шаблоны WordPress
В чём различие между шаблонами HTML и WordPress. Кроме того, что создаются они разными способами. Конкретно имею в виду, почему их...


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

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