Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052

Не удается перегрузить литеральный оператор

05.02.2018, 15:02. Показов 2650. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Читаю Stroustrup "The C++ Programming Language" 4th Edition. [c++11].
Разбираюсь с метапрограммированием(28.7 SI Units Example).
При переписывании кода по учебнику возникла проблема с перегрузкой литеральных операторов (до этого никогда не пытался делать что-то подобное).
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
template<int M, int K, int S>
struct Unit {
    enum { m = M, kg = K, s = S };
};
 
using M = Unit<1, 0, 0>; // meters
using Kg = Unit<0, 1, 0>; // kilograms
using S = Unit<0, 0, 1>; // seconds
using MpS = Unit<1, 0, -1>; // meters per second (m/s)
using MpS2 = Unit<1, 0, -2>; // meters per square second (m/(s*s))
 
// Сумма
template<typename U1, typename U2>
struct Uplus {
    using type = Unit<U1::m + U2::m, U1::kg + U2::kg, U1::s + U2::s>;
};
 
template<typename U1, typename U2>
using Unit_plus = typename Uplus<U1, U2>::type;
// Разность
template<typename U1, typename U2>
struct Uminus {
    using type = Unit<U1::m - U2::m, U1::kg - U2::kg, U1::s - U2::s>;
};
 
template<typename U1, typename U2>
using Unit_minus = typename Uminus<U1, U2>::type;
// struct Величина
template<typename U>
struct Quantity {
    double val;
    explicit Quantity(double d) : val{ d } {}
};
// Оператор суммы величин
template<typename U>
Quantity<U> operator+(Quantity<U> x, Quantity<U> y) // same dimension
{
    return Quantity<U>{x.val + y.val};
}
// Оператор разности величин
template<typename U>
Quantity<U> operator-(Quantity<U> x, Quantity<U> y) // same dimension
{
    return Quantity<U>{x.val-y.val};
}
// Оператор произведения величин
template<typename U1, typename U2>
Quantity<Unit_plus<U1, U2>> operator*(Quantity<U1> x, Quantity<U2> y)
{
    return Quantity<Unit_plus<U1, U2>>{x.val*y.val};
}
// Оператор деления величин
template<typename U1, typename U2>
Quantity<Unit_minus<U1, U2>> operator/(Quantity<U1> x, Quantity<U2> y)
{
    return Quantity<Unit_minus<U1, U2>>{x.val / y.val};
}
// Оператор произведения величины с вещественным числом
template<typename U>
Quantity<U> operator*(Quantity<U> x, double y)
{
    return Quantity<U>{x.val*y};
}
// Оператор деления величины с вещественным числом
template<typename U>
Quantity<U> operator*(double x, Quantity<U> y)
{
    return Quantity<U>{x*y.val};
}
// Пользовательский литералы для величин
/* ТУТ ОШИБКИ */
constexpr Quantity<M> operator"" _m(double d) { return Quantity<M>{d}; }
constexpr Quantity<Kg> operator"" _kg(double d) { return Quantity<Kg>{d}; }
constexpr Quantity<S> operator"" _s(double d) { return Quantity<S>{d}; }
constexpr Quantity<M> operator"" _km(double d) { return Quantity<M>{ 1000 * d }; }
constexpr Quantity<Kg> operator"" _g(double d) { return Quantity<Kg>{ d / 1000 }; }
constexpr Quantity<Kg> operator"" _mg(double d) { return Quantity<Kg>{ d / 10000000 }; } // milligram
constexpr Quantity<S> operator"" _ms(double d) { return Quantity<S>{ d / 1000 }; } // milliseconds
constexpr Quantity<S> operator"" _us(double d) { return Quantity<S>{ d / 1000 }; } // microseconds
constexpr Quantity<S> operator"" _ns(double d) { return Quantity<S>{ d / 1000000000 }; } // nanoseconds
// -------------------------------------
Error List:
Кликните здесь для просмотра всего текста
Серьезность Код Описание Строка Состояние подавления
Ошибка C3684 "operator ""_ms": объявление литерального оператора имеет недопустимый список параметров 77
Ошибка C3684 "operator ""_g": объявление литерального оператора имеет недопустимый список параметров 75
Ошибка C3684 "operator ""_kg": объявление литерального оператора имеет недопустимый список параметров 72
Ошибка C3684 "operator ""_km": объявление литерального оператора имеет недопустимый список параметров 74
Ошибка C3684 "operator ""_m": объявление литерального оператора имеет недопустимый список параметров 71
Ошибка C3684 "operator ""_mg": объявление литерального оператора имеет недопустимый список параметров 76
Ошибка C3684 "operator ""_ns": объявление литерального оператора имеет недопустимый список параметров 79
Ошибка C3684 "operator ""_s": объявление литерального оператора имеет недопустимый список параметров 73
Ошибка C3684 "operator ""_us": объявление литерального оператора имеет недопустимый список параметров 78
Ошибка C3757 "Quantity<Kg>": для функции "constexpr" тип недопустим 72
Ошибка C3757 "Quantity<Kg>": для функции "constexpr" тип недопустим 75
Ошибка C3757 "Quantity<Kg>": для функции "constexpr" тип недопустим 76
Ошибка C3757 "Quantity<M>": для функции "constexpr" тип недопустим 71
Ошибка C3757 "Quantity<M>": для функции "constexpr" тип недопустим 74
Ошибка C3757 "Quantity<S>": для функции "constexpr" тип недопустим 73
Ошибка C3757 "Quantity<S>": для функции "constexpr" тип недопустим 77
Ошибка C3757 "Quantity<S>": для функции "constexpr" тип недопустим 78
Ошибка C3757 "Quantity<S>": для функции "constexpr" тип недопустим 79
Ошибка (активно) недопустимый тип параметра с плавающей запятой ("double") для литерального оператора; предполагается тип long double 71
Ошибка (активно) недопустимый тип параметра с плавающей запятой ("double") для литерального оператора; предполагается тип long double 72
Ошибка (активно) недопустимый тип параметра с плавающей запятой ("double") для литерального оператора; предполагается тип long double 73
Ошибка (активно) недопустимый тип параметра с плавающей запятой ("double") для литерального оператора; предполагается тип long double 74
Ошибка (активно) недопустимый тип параметра с плавающей запятой ("double") для литерального оператора; предполагается тип long double 75
Ошибка (активно) недопустимый тип параметра с плавающей запятой ("double") для литерального оператора; предполагается тип long double 76
Ошибка (активно) недопустимый тип параметра с плавающей запятой ("double") для литерального оператора; предполагается тип long double 77
Ошибка (активно) недопустимый тип параметра с плавающей запятой ("double") для литерального оператора; предполагается тип long double 78
Ошибка (активно) недопустимый тип параметра с плавающей запятой ("double") для литерального оператора; предполагается тип long double 79
Ошибка (активно) функцию "operator ""_g" (объявлено в строке 75) не было ранее объявлено как constexpr 75
Ошибка (активно) функцию "operator ""_kg" (объявлено в строке 72) не было ранее объявлено как constexpr 72
Ошибка (активно) функцию "operator ""_km" (объявлено в строке 74) не было ранее объявлено как constexpr 74
Ошибка (активно) функцию "operator ""_m" (объявлено в строке 71) не было ранее объявлено как constexpr 71
Ошибка (активно) функцию "operator ""_mg" (объявлено в строке 76) не было ранее объявлено как constexpr 76
Ошибка (активно) функцию "operator ""_ms" (объявлено в строке 77) не было ранее объявлено как constexpr 77
Ошибка (активно) функцию "operator ""_ns" (объявлено в строке 79) не было ранее объявлено как constexpr 79
Ошибка (активно) функцию "operator ""_s" (объявлено в строке 73) не было ранее объявлено как constexpr 73
Ошибка (активно) функцию "operator ""_us" (объявлено в строке 78) не было ранее объявлено как constexpr 78
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.02.2018, 15:02
Ответы с готовыми решениями:

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор *
Помогите в следующем: Для класса шаблона следует перегрузить оператор присваивания, конструктор копирования, бинарный оператор суммы «*»,...

Как перегрузить оператор<< и оператор>> ?
Доброго времени суток. Застрял на двух вопросах и не как не могу найти инфу которвя мне помогла бы их решить. вопрос первый. В общем...

Перегрузить оператор -
Есть 2 масива если в них есть 2 одинаковых числа то з первого масива что бы изменялось на ноль например то число которое есть во втором...

3
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
05.02.2018, 15:09
А ежели везде поменять double на long double?
1
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
05.02.2018, 15:14  [ТС]
Croessmah, от constexpr тоже пришлось избавиться, ибо хайлайтит
его и пишет...
XML
1
2
3
Ошибка (активно)       функцию "operator ""_m" (объявлено в строке 71) не было ранее объявлено как constexpr 71
Ошибка    C2134   'Quantity<M>::Quantity': вызов не связан с константным выражением    71
Ошибка    C3757   "Quantity<M>": для функции "constexpr" тип недопустим    71
C++
1
2
3
4
5
6
7
8
9
10
11
// Пользовательский литералы для величин
const Quantity<M> operator"" _m(long double d) { return Quantity<M>{d}; }
const Quantity<Kg> operator"" _kg(long double d) { return Quantity<Kg>{d}; }
const Quantity<S> operator"" _s(long double d) { return Quantity<S>{d}; }
const Quantity<M> operator"" _km(long double d) { return Quantity<M>{ 1000 * d }; }
const Quantity<Kg> operator"" _g(long double d) { return Quantity<Kg>{ d / 1000 }; }
const Quantity<Kg> operator"" _mg(long double d) { return Quantity<Kg>{ d / 10000000 }; } // milligram
const Quantity<S> operator"" _ms(long double d) { return Quantity<S>{ d / 1000 }; } // milliseconds
const Quantity<S> operator"" _us(long double d) { return Quantity<S>{ d / 1000 }; } // microseconds
const Quantity<S> operator"" _ns(long double d) { return Quantity<S>{ d / 1000000000 }; } // nanoseconds
// -------------------------------------
Теперь везде отсутствует highlight, но пишет:
XML
1
2
3
4
5
6
7
8
9
Ошибка    C2398   Элемент "1": преобразование из "long double" в "double" требует сужающего преобразования  79
Ошибка    C2398   Элемент "1": преобразование из "long double" в "double" требует сужающего преобразования  71
Ошибка    C2398   Элемент "1": преобразование из "long double" в "double" требует сужающего преобразования  72
Ошибка    C2398   Элемент "1": преобразование из "long double" в "double" требует сужающего преобразования  73
Ошибка    C2398   Элемент "1": преобразование из "long double" в "double" требует сужающего преобразования  74
Ошибка    C2398   Элемент "1": преобразование из "long double" в "double" требует сужающего преобразования  75
Ошибка    C2398   Элемент "1": преобразование из "long double" в "double" требует сужающего преобразования  76
Ошибка    C2398   Элемент "1": преобразование из "long double" в "double" требует сужающего преобразования  77
Ошибка    C2398   Элемент "1": преобразование из "long double" в "double" требует сужающего преобразования  78
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
05.02.2018, 15:28
Лучший ответ Сообщение было отмечено anapshy как решение

Решение

Цитата Сообщение от anapshy Посмотреть сообщение
Теперь везде отсутствует highlight, но пишет:
Я сказал везде поменять на long double, чтобы такого не было.
Ну, либо делайте явные касты, чтобы избавится от этого:
C++
1
constexpr Quantity<M> operator"" _m(long double d) { return Quantity<M>{static_cast<double>(d)}; }
Цитата Сообщение от anapshy Посмотреть сообщение
от constexpr тоже пришлось избавиться
Лучше добавить constexpr в конструктор:
C++
1
2
    long double val;
    explicit constexpr Quantity(long double d) : val{ d } {}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.02.2018, 15:28
Помогаю со студенческими работами здесь

Перегрузить оператор
Хай class Stalk { int length; public: Stalk() { //cout &lt;&lt; &quot;Constructor Stack&quot; &lt;&lt; endl; } ...

перегрузить оператор ++
Всем привет!!!Тут такое дело, когда запускаю программу она запускается, а когда дело доходит до перегрузки она выдает ошибку((: То есть...

Перегрузить оператор []
Как два раза перегрузить оператор , чтобы можно было сложить +объект+ #define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; ...

Перегрузить оператор
Привет всем! Помогите решить задачку. Перегрузить оператор для объекта содержащего два закрытых элемента так, чтоб элемент одного...

Перегрузить оператор (true)
Задание: Реализовать класс Линия, хранящую коэффициенты уравнения от двух переменных (ax + by + c = 0) Реализовать перегрузку методов ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru