Russian Qt Forum
Ноябрь 23, 2024, 08:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: overload функции и наследование  (Прочитано 13736 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #15 : Июнь 15, 2009, 07:15 »

Цитировать
@kuzulis: Давай весь код TWinSerialDevice и TBaseSerialDevice и полный текст ошибки компилятора.

вот прицепил архив со всеми файлами Улыбающийся .. поможите люди добрые!

в архиве:
 - каталог src является библиотекой, она компилится без ошибок!
 - каталог \examples\default\ является тестовой аппликушкой, в которой я проверяю работу библиотеки.. и вот в этой аппликушки и идут ошибки

вот вывод компилятора:
Цитировать
D:\projects\QSerialDevice_11062009_1700\examples\default>qmake default.pro

D:\projects\QSerialDevice_11062009_1700\examples\default>make
g++ -c -O2 -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -D_TTY_WIN_ -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_THREA
D_SUPPORT -I"D:/Qt/4.1.1/include/QtCore" -I"D:/Qt/4.1.1/include" -I"..\..\src" -I"D:/Qt/4.1.1/includ
e/ActiveQt" -I"build\moc" -I"D:/Qt/4.1.1/mkspecs/win32-g++" -o build\obj\main.o main.cpp
main.cpp: In function `int main(int, char**)':
main.cpp:32: error: no matching function for call to `TWinSerialDevice::setBaudRate(QString&)'
../../src/winserialdevice.h:18: note: candidates are: virtual bool TWinSerialDevice::setBaudRate(TBa
seSerialDevice::TBaudRate)
main.cpp:33: error: no matching function for call to `TWinSerialDevice::setDataBits(const char[6])'
../../src/winserialdevice.h:19: note: candidates are: virtual bool TWinSerialDevice::setDataBits(TBa
seSerialDevice::TDataBits)
main.cpp:34: error: no matching function for call to `TWinSerialDevice::setParity(const char[5])'
../../src/winserialdevice.h:20: note: candidates are: virtual bool TWinSerialDevice::setParity(TBase
SerialDevice::TParity)
main.cpp:35: error: no matching function for call to `TWinSerialDevice::setStopBits(const char[2])'
../../src/winserialdevice.h:21: note: candidates are: virtual bool TWinSerialDevice::setStopBits(TBa
seSerialDevice::TStopBits)
main.cpp:36: error: no matching function for call to `TWinSerialDevice::setFlowControl(const char[9]
)'
../../src/winserialdevice.h:22: note: candidates are: virtual bool TWinSerialDevice::setFlowControl(
TBaseSerialDevice::TFlow)
mingw32-make: *** [build\obj\main.o] Error 1

D:\projects\QSerialDevice_11062009_1700\examples\default>
Записан

ArchLinux x86_64 / Win10 64 bit
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #16 : Июнь 15, 2009, 07:19 »

упс.. а как прицепить файл?

в "дополнительных опциях" нет возможности прицепить ничего! Грустный


вот сюда положил архив: http://www.prog.org.ru/topic_9537_15.html

см. самый конец поста , файл QSerialDevice_11062009_1700.zip (51.3 Кб)
« Последнее редактирование: Июнь 15, 2009, 07:33 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
mugabe
Гость
« Ответ #17 : Июнь 15, 2009, 10:17 »

Это не то, внимательнее почитайте свою ссылку и код в первом посте. У kuzulis'а  всё в public лежит.

@kuzulis: Давай весь код TWinSerialDevice и TBaseSerialDevice и полный текст ошибки компилятора.
AX прав, это именно то.

kuzulis, либо прислушайся к AX, либо переменуй setBaudRate который принимает строку в качестве параметра
« Последнее редактирование: Июнь 15, 2009, 10:19 от mugabe » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #18 : Июнь 15, 2009, 11:33 »

Всем спасибо, я просто переименую функцию и всё! Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Barmaglodd
Гость
« Ответ #19 : Июнь 15, 2009, 11:59 »

Я не прав.  Можно либо, как AX сказал, по имени вызывать, либо в TWinSerialDevice добавить using TBaseSerialDevice::setBaudRate;, если MinGW using поддерживает.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #20 : Июнь 15, 2009, 19:22 »

вообще это известная фича, указанная в стандарте с++
class A
{ void f(int); }
class B : public A {void f(void);}
 B b;
 b.f(10); //ошибка!
 b.A::f(10); //вот так верно (вроде - проверять лень)
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #21 : Июнь 16, 2009, 02:41 »

Авварон, в вашем примере сигнатуры функций отличаются параметрами, в примере автора как я понял этих отличий нет

Код:
class TBaseSerialDevice : public QIODevice
{
...
public:
....
    virtual bool setBaudRate(TBaudRate baudRate=BaudRate9600)
}

class TWinSerialDevice : public TBaseSerialDevice
{
....
    bool setBaudRate(TBaudRate baudRate); {//тут уже другая реализация нежели в TBaseSerialDevice т.е я переопределяю эту виртуальную ф-ю }
....
}

Но отличаются функции параметрами по умолчанию - точнее в наследнике он не указан, я к сожалению не в курсе является ли параметр по умолчанию частью сигнатуры функции?

Я бы вообще написал так
Код:
class TBaseSerialDevice : public QIODevice
{
...
public:
....
    virtual bool setBaudRate(TBaudRate baudRate=BaudRate9600)
}

class TWinSerialDevice : public TBaseSerialDevice
{
....
    virtual bool setBaudRate(TBaudRate baudRate=BaudRate9600)
....
}

Хоть virtual указывать не обязательно - но это не оставит сомнений для кого-то кто будет разбирать код что функция виртуальная, а вот на счет параметра по умолчанию - мы можем указать его дургим, но с этим связан интересный подвох -- предлагю всем проверить себя
http://habrahabr.ru/blogs/cpp/53576/

а вот если параметр по умолчанию убрать - может это уже совсем другая функция (прошу гуру C++ дать ответ)

К сожалению у меня не компилируется скачанный пример и в другом месте, так бы с удовольствием поразбирался сам..

полный вывод ошибки компиляции
Код:
Running build steps for project project...
Creating gdb macros library...
Starting: /usr/local/qtsdk-2009.01/qt/bin/qmake /home/bboy/Templates/111/QSerialDevice_11062009_1700/project.pro -spec linux-g++ -r
Reading /home/bboy/Templates/111/QSerialDevice_11062009_1700/src/src.pro
Reading /home/bboy/Templates/111/QSerialDevice_11062009_1700/examples/reader/reader.pro
Reading /home/bboy/Templates/111/QSerialDevice_11062009_1700/examples/writer/writer.pro
Exited with code 0.
Starting: /usr/bin/make -w
make: Entering directory `/home/bboy/Templates/111/QSerialDevice_11062009_1700'
cd src/ && /usr/bin/make -f Makefile
make[1]: Entering directory `/home/bboy/Templates/111/QSerialDevice_11062009_1700/src'
g++ -c -pipe -O2 -fPIC -D_REENTRANT -Wall -W -D_TTY_POSIX_ -DQT_NO_DEBUG -DQT_CORE_LIB -I/usr/local/qtsdk-2009.01/qt/mkspecs/linux-g++ -I. -I/usr/local/qtsdk-2009.01/qt/include/QtCore -I/usr/local/qtsdk-2009.01/qt/include -Ibuild/moc -o build/obj/posixserialdevice.o posixserialdevice.cpp
posixserialdevice.cpp: In member function ‘virtual bool TPosixSerialDevice::open(QFlags<QIODevice::OpenModeFlag>)’:
posixserialdevice.cpp:104: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:134: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘deviceName’
posixserialdevice.cpp:138: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:145: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:155: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:309: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘baudRate’
posixserialdevice.cpp:310: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘dataBits’
posixserialdevice.cpp:311: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘parity’
posixserialdevice.cpp:312: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘stopBits’
posixserialdevice.cpp:313: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘flowControl’
posixserialdevice.cpp:314: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘charIntervalTimeout’
posixserialdevice.cpp:317: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:323: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp: In member function ‘virtual void TPosixSerialDevice::close()’:
posixserialdevice.cpp:348: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:352: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp: In member function ‘virtual bool TPosixSerialDevice::setBaudRate(TBaseSerialDevice::TBaudRate)’:
posixserialdevice.cpp:403: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘baudRate’
posixserialdevice.cpp:406: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘baudRate’
posixserialdevice.cpp:409: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘baudRate’
posixserialdevice.cpp:413: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘baudRate’
posixserialdevice.cpp:420: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘baudRate’
posixserialdevice.cpp:423: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘baudRate’
posixserialdevice.cpp:562: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:568: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:572: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp: In member function ‘virtual bool TPosixSerialDevice::setDataBits(TBaseSerialDevice::TDataBits)’:
posixserialdevice.cpp:613: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘dataBits’
posixserialdevice.cpp:615: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘stopBits’
posixserialdevice.cpp:616: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘stopBits’
posixserialdevice.cpp:617: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘parity’
posixserialdevice.cpp:620: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘dataBits’
posixserialdevice.cpp:627: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘stopBits’
posixserialdevice.cpp:631: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘dataBits’
posixserialdevice.cpp:638: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘stopBits’
posixserialdevice.cpp:642: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘dataBits’
posixserialdevice.cpp:649: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘stopBits’
posixserialdevice.cpp:653: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘dataBits’
posixserialdevice.cpp:660: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘stopBits’
posixserialdevice.cpp:664: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘dataBits’
posixserialdevice.cpp:674: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:680: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:684: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp: In member function ‘virtual bool TPosixSerialDevice::setParity(TBaseSerialDevice::TParity)’:
posixserialdevice.cpp:727: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘parity’
posixserialdevice.cpp:728: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘dataBits’
posixserialdevice.cpp:731: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘parity’
posixserialdevice.cpp:738: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘dataBits’
posixserialdevice.cpp:743: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘dataBits’
posixserialdevice.cpp:745: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘dataBits’
posixserialdevice.cpp:749: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘dataBits’
posixserialdevice.cpp:753: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘dataBits’
posixserialdevice.cpp:782: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:788: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:792: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp: In member function ‘virtual bool TPosixSerialDevice::setStopBits(TBaseSerialDevice::TStopBits)’:
posixserialdevice.cpp:832: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘stopBits’
posixserialdevice.cpp:833: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘dataBits’
posixserialdevice.cpp:835: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘stopBits’
posixserialdevice.cpp:842: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘stopBits’
posixserialdevice.cpp:850: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘dataBits’
posixserialdevice.cpp:854: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘stopBits’
posixserialdevice.cpp:863: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:869: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:873: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp: In member function ‘virtual bool TPosixSerialDevice::setFlowControl(TBaseSerialDevice::TFlow)’:
posixserialdevice.cpp:908: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘flowControl’
posixserialdevice.cpp:909: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘flowControl’
posixserialdevice.cpp:933: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:939: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:943: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp: In member function ‘virtual bool TPosixSerialDevice::setCharIntervalTimeout(int)’:
posixserialdevice.cpp:961: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘charIntervalTimeout’
posixserialdevice.cpp:965: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:972: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:978: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp: In member function ‘qint64 TPosixSerialDevice::bytesAvailable()’:
posixserialdevice.cpp:1004: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:1010: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp: In member function ‘virtual bool TPosixSerialDevice::setDtr(bool)’:
posixserialdevice.cpp:1036: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:1047: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:1053: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp: In member function ‘virtual bool TPosixSerialDevice::setRts(bool)’:
posixserialdevice.cpp:1079: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:1090: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:1096: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp: In member function ‘virtual ulong TPosixSerialDevice::lineStatus()’:
posixserialdevice.cpp:1133: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:1162: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp: In member function ‘virtual bool TPosixSerialDevice::waitForReadyRead(int, bool)’:
posixserialdevice.cpp:1223: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:1235: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:1246: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:1250: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp: In member function ‘virtual bool TPosixSerialDevice::waitForBytesWritten(int)’:
posixserialdevice.cpp:1306: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:1316: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:1324: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:1328: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp: In member function ‘virtual qint64 TPosixSerialDevice::readData(char*, qint64)’:
posixserialdevice.cpp:1362: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:1378: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:1387: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:1394: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:1401: error: ‘class TBaseSerialDevice::TSerialSettings’ has no member named ‘charIntervalTimeout’
posixserialdevice.cpp: In member function ‘virtual qint64 TPosixSerialDevice::writeData(const char*, qint64)’:
posixserialdevice.cpp:1433: error: ‘errors’ was not declared in this scope
posixserialdevice.cpp:1439: error: ‘errors’ was not declared in this scope
make[1]: Leaving directory `/home/bboy/Templates/111/QSerialDevice_11062009_1700/src'
make[1]: *** [build/obj/posixserialdevice.o] Error 1
make: Leaving directory `/home/bboy/Templates/111/QSerialDevice_11062009_1700'
make: *** [sub-src-make_default-ordered] Error 2
Exited with code 2.
Error while building project project
When executing build step 'Make'
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #22 : Июнь 16, 2009, 08:11 »

2 break ,

под *.nix yне будет собираться Улыбающийся ..  та версия еще не отлажена была.. собирается только из под Windows Улыбающийся  ... Попожжа кину исправленый вариант Улыбающийся

(если кому нужно буит)
« Последнее редактирование: Июнь 16, 2009, 08:15 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #23 : Июнь 16, 2009, 08:14 »

Да и я не стал "парится" над этой проблемой -  а просто переименовал все ф-ции :
Код:
...
virtual bool setBaudRate(TBaudRate baudRate=BaudRate9600)
...

на :
Код:
...
virtual bool m_setBaudRate(TBaudRate baudRate=BaudRate9600)
...
и перенес их в раздел protected
Записан

ArchLinux x86_64 / Win10 64 bit
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #24 : Июнь 16, 2009, 08:51 »

2 Авварон,

Вы наверное правы... я только что вычитал в книжке : "ООП на с++" А. Пол. И по-моему в таких случаях ничего сделать нельзя и только 2 выхода:
1. Либо переименовать
2. Либо вызывать "через ..." - что не есть гут!  Улыбающийся

Записан

ArchLinux x86_64 / Win10 64 bit
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #25 : Июнь 16, 2009, 09:54 »

нужно явное указание области видимости. Вообще в с++ это сделано тк предполагалось использование множественных перегрузок => страуструп "позаботился" о производительности компилятора. Сюда же ограничение на приведение автоматическое типов в операторах (компилятор перебирает только варианты, имеющие глубину 2 - 1 пользовательское приведение и 1 стандартное, если не вру)
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.161 секунд. Запросов: 23.