Ответ 1
Вызов
fd = ::open(_portName.c_str(), O_RDWR | O_NOCTTY );
Двойной двоеточие (::
) перед именем функции С++ оператор разрешения области видимости:
Если оператор разрешения помещен перед именем переменной, тогда глобальная переменная.
У меня есть этот класс с методом экземпляра с именем open и ему нужно вызвать функцию, объявленную в C, также называемую open. Выполняется выборка:
void SerialPort::open()
{
if(_open)
return;
fd = open (_portName.c_str(), O_RDWR | O_NOCTTY );
_open = true;
}
Когда я пытаюсь скомпилировать его (используя GCC), я получаю следующую ошибку:
error: no matching function for call to 'SerialPort::open(const char*, int)'
Я включил все необходимые заголовки C. Когда я меняю имя метода, например open2, у меня нет проблем с компиляцией.
Как я могу решить эту проблему. Спасибо заранее.
Вызов
fd = ::open(_portName.c_str(), O_RDWR | O_NOCTTY );
Двойной двоеточие (::
) перед именем функции С++ оператор разрешения области видимости:
Если оператор разрешения помещен перед именем переменной, тогда глобальная переменная.
Напишите ::open
вместо open
. Префикс ::
указывает, что имя должно быть взято из глобальной области. (Глобальное пространство имен? Я не уверен в его точном значении, если честно...)
добавить "::" до open (_portName.c_str(), O_RDWR | O_NOCTTY );
Убедитесь, что:
1) Вы используете разрешение пространства имен, если вызывающая функция и вызываемая функция находятся в разных пространствах имен, включая родительское пространство имен
2) Если ваша вызывающая функция определена выше, вызываемая функция объявляет функцию перед функцией вызывающего абонента. например:
void bar();
void foo()
{
bar();
}
void bar()
{
....
}