C++, конфликт между библиотечной функцией и унаследованной функцией класса
#include <iostream>
#include <unistd.h>
using namespace std;
class A{
public:
bool close(){ return true; }
};
class B: public A{
public:
void fun(){
(void) close(1);
}
};
int main() {
B b;
b.fun();
return 0;
}
В классе BI хочу вызвать функцию close(1), которая есть в библиотеке unistd.h. К вашему сведению: close(int fileDes) используется для закрытия файловых дескрипторов в процессе.
Итак, как победить проблему. Я получил следующую ошибку:
source.cpp: In member function 'void B::fun()':
source.cpp:11:27: error: no matching function for call to 'B::close(int)'
11 | (void) close(1);
| ^
source.cpp:6:14: note: candidate: 'bool A::close()'
6 | bool close(){ return true; }
| ^~~~~
source.cpp:6:14: note: candidate expects 0 arguments, 1 provided
Итак, как решить проблему, чтобы она вызывала функцию в файле unistd.h.
1 ответ
В области функции-членаfun
имя как неквалифицированное имя ищется в области видимости класса
void fun(){
(void) close(1);
}
И действительно, есть еще одна функция-членclose
в базовом классе с таким именем.
Поэтому компилятор выбирает эту функцию.
Если вы хотите использовать функцию из пространства имен, используйте полное имя, например,
void fun(){
(void) ::close(1);
}