|
|
||||||
Наследование шаблона20.06.2012, 12:53. Показов 1214. Ответов 13
Метки нет (Все метки)
Есть два шаблона Array and NumericArray
Хочется реализовать между ними иерархию типа NumericArray диревативынй класс а Array родительский. Вообщем вроде что то получается, но вот какая ошибка вылезла не могли бы посмотреть. Заранее спасибо ! compiler error: 1>------ Build started: Project: HP3_4.2b_ex2_with_inheritance, Configuration: Release Win32 ------ 1> main.cpp 1>main.cpp(9): error C2143: syntax error : missing ';' before 'using' 1>main.cpp(9): error C2143: syntax error : missing ';' before '<end Parse>' ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== last edition of my code:
0
|
||||||
| 20.06.2012, 12:53 | |
|
Ответы с готовыми решениями:
13
Как правильно производится наследование элементов от шаблона класса? В чем ошибка? |
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
| 20.06.2012, 13:27 | ||||||
1
|
||||||
|
|
|||||||
| 20.06.2012, 13:36 [ТС] | |||||||
|
1>------ Build started: Project: HP3_4.2b_ex2_with_inheritance, Configuration: Release Win32 ------ 1> main.cpp 1>c:\all my\с++\ha level 6\solution\level 6\hp3_4.2b_ex2_with_inheritance\NumericA rray.h(30): error C2614: 'NumericArray<Type>' : illegal member initialization: 'm_data' is not a base or member 1> with 1> [ 1> Type=Point 1> ] 1> c:\all my\с++\ha level 6\solution\level 6\hp3_4.2b_ex2_with_inheritance\NumericA rray.h(29) : while compiling class template member function 'NumericArray<Type>::NumericArray(int)' 1> with 1> [ 1> Type=Point 1> ] 1> main.cpp(14) : see reference to class template instantiation 'NumericArray<Type>' being compiled 1> with 1> [ 1> Type=Point 1> ] 1>c:\all my\с++\ha level 6\solution\level 6\hp3_4.2b_ex2_with_inheritance\NumericA rray.h(30): error C2614: 'NumericArray<Type>' : illegal member initialization: 'm_size' is not a base or member 1> with 1> [ 1> Type=Point 1> ] 1>c:\all my\с++\ha level 6\solution\level 6\hp3_4.2b_ex2_with_inheritance\NumericA rray.h(66): warning C4172: returning address of local variable or temporary 1> c:\all my\с++\ha level 6\solution\level 6\hp3_4.2b_ex2_with_inheritance\NumericA rray.h(59) : while compiling class template member function 'NumericArray<Type> &NumericArray<Type> erator *(double) const'1> with 1> [ 1> Type=Point 1> ] ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== "'m_data' is not a base or member" Но почему Я же реализовал наследование и типа сделал в родительско классе protected (not private ) ... Что опять не так ??? кстати вот реализация = оператора :
0
|
|||||||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|||||||||||
| 20.06.2012, 13:53 | |||||||||||
|
Leeto, А не логичнее-ли просто вызвать создание объекта array? Т.е.
Вместо.
1
|
|||||||||||
|
|
||
| 20.06.2012, 14:09 [ТС] | ||
|
1>------ Build started: Project: HP3_4.2b_ex2_with_inheritance, Configuration: Release Win32 ------ 1> main.cpp 1>c:\all my\с++\ha level 6\solution\level 6\hp3_4.2b_ex2_with_inheritance\NumericA rray.h(27): error C2065: 'size' : undeclared identifier 1> c:\all my\с++\ha level 6\solution\level 6\hp3_4.2b_ex2_with_inheritance\NumericA rray.h(27) : while compiling class template member function 'NumericArray<Type>::NumericArray(int)' 1> with 1> [ 1> Type=Point 1> ] 1> main.cpp(14) : see reference to class template instantiation 'NumericArray<Type>' being compiled 1> with 1> [ 1> Type=Point 1> ] 1>c:\all my\с++\ha level 6\solution\level 6\hp3_4.2b_ex2_with_inheritance\NumericA rray.h(60): warning C4172: returning address of local variable or temporary 1> c:\all my\с++\ha level 6\solution\level 6\hp3_4.2b_ex2_with_inheritance\NumericA rray.h(53) : while compiling class template member function 'NumericArray<Type> &NumericArray<Type>::operator *(double) const' 1> with 1> [ 1> Type=Point 1> ] ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
0
|
||
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
| 20.06.2012, 14:11 | |
|
ну вы хоть ошибки то читаете? написано же, что size - неизвестный идентификатор. в конструкторе у аргумента имя не size а new_size.
и new_size - дуратское имя. когда мы в конструкторе никаких старых размеров еще не было. поэтому логичнее просто size. на ворнинги тоже обратите внимание. возвращать ссылки или указатели на локальные объекты нельзя. это приведет к падению програмы. в операторе * у вас как раз возвращение ссылки на локальный объект.
1
|
|
|
|
||
| 20.06.2012, 14:18 [ТС] | ||
|
но там воринги есть 1>------ Build started: Project: HP3_4.2b_ex2_with_inheritance, Configuration: Release Win32 ------ 1> main.cpp 1>c:\all my\с++\ha level 6\solution\level 6\hp3_4.2b_ex2_with_inheritance\NumericA rray.h(60): warning C4172: returning address of local variable or temporary 1> c:\all my\с++\ha level 6\solution\level 6\hp3_4.2b_ex2_with_inheritance\NumericA rray.h(53) : while compiling class template member function 'NumericArray<Type> &NumericArray<Type>::operator *(double) const' 1> with 1> [ 1> Type=Point 1> ] 1> main.cpp(14) : see reference to class template instantiation 'NumericArray<Type>' being compiled 1> with 1> [ 1> Type=Point 1> ] ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ========== насколько они критичны ? подскажите пожалуйста
0
|
||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 20.06.2012, 14:19 | |
|
Уберите ссылку из возвращаемого типа и все.
1
|
|
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
| 20.06.2012, 14:21 | |
|
я уже написал что максимально критичны. программа будет вести себя неопределенным образом. скорее всего падать. оператор * должен возвращать объект а не ссылку на него. а вот оператор *= - уже ссылку. обычно один реализуется за счет другого. причем operator * делается как вравило в виде свободной функции.
вообще походче что NumericArray сделан только ради добавления оператора *. Но его можно сделать в виде свободной шаблонной функции для всего семейства классов Array<T>. Если для объектов типа T операция умножения на double корректна, то код будет компилироватся для массива объектов таких типов, если же такой операции нет - то просто не скомпилится попытка использовать такой оператор. если оператор для таких объектов не использовать, то все по прежнему будет компилиться.
1
|
|
|
|
|||
| 20.06.2012, 14:25 [ТС] | |||
|
Добавлено через 4 минуты
0
|
|||
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
||||||
| 20.06.2012, 14:31 | ||||||
|
я вот к чему. например для класса std::string реализована операция сложения. и ваш базовый класс для массива будет работать со строками. было бы логично воспользоватся возможностью прибавить к массиву строк другую строку, что приведет к сложению к каждому элементу массива этой строки. но в текущей реализации для этого просто Array<std::string> использовать нельзя. Нужно использовать NumericArray<std::string> что выглядит как-то кривовато. Пожно было бы написать одну шаблонную функцию для такого сложения и это бы компилилось в случае, если объекты массива поддерживают операцию сложения
1
|
||||||
|
|
||
| 20.06.2012, 14:50 [ТС] | ||
|
даже есть схемка UML ская )) Но огромное вам спасибо что вам не все равно )
0
|
||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||
| 20.06.2012, 14:55 | ||
|
DU,
1
|
||
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
||
| 20.06.2012, 14:59 | ||
|
Ну раз выбор осознанный, то ладно.
Еще в догонку у класса NumericArray нужны только конструкторы, для вызова конструкторов базового класса и дополнительные операторы + и *. Деструктор и оператор = не нужно по новому реализовывать. Все, что нужно уже делается в базовом классе.
1
|
||
| 20.06.2012, 14:59 | |
|
Помогаю со студенческими работами здесь
14
Определение метода-шаблона за пределами шаблона класса Заменить наследование классов на наследование интерфейсов Наследование конструктора от переменного шаблона Gtest, доступ к элементам базового класса-шаблона без указания параметров шаблона. баг или фича? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|