Вызов в C++ не функция членства в классе с методом с тем же

Я имею этот класс с методом экземпляра, названным открытым, и должен вызвать функцию, объявленную в C, также названном открытым. Следует за образцом:

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, у меня нет не компиляции задач.

Как я могу решить эту проблему. Заранее спасибо.

12
задан jassuncao 5 February 2010 в 13:56
поделиться

3 ответа

Call

fd = ::open(_portName.c_str(), O_RDWR | O_NOCTTY );

The double colon (::) перед именем функции является оператор разрешения области видимости C++ :

Если оператор разрешения находится в положении перед именем переменной, затем глобальная переменная затронута.

34
ответ дан 2 December 2019 в 03:18
поделиться

Проблема в том, что на самом деле это не то, как быстро работает. Quicksort - рекурсивный алгоритм, который должен вызываться только один раз вне себя. Идея заключается в том, что при каждой итерации массив разделяется на две половины - левая половина содержит все элементы, меньшие, чем ось вращения, а правая половина содержит все элементы, превышающие/равные оси вращения. Затем вы ускорите две половины и, наконец, положите ось в середине.

Если сторона быстрой сортировки имеет длину менее 3 элементов, можно просто поменять местами два элемента или оставить их, и эта часть массива будет выполнена.

Но не похоже, что ваш код делает это вообще - вы звоните Quicksort 6 раз от вашего клиента, и в рамках функции quicksort вы делаете максимум один своп. Так что это не тот случай, когда кто-то сможет посмотреть на ваш код и отладить его, сказав вам перенести обмен или что-то еще. Вам нужно вернуться к своей логике.

Посмотрите диаграмму Википедии для наглядного примера того, что должно произойти в одной итерации:

http://en.wikipedia.org/wiki/File: Partition _ example.svg

-121--4222964-

EventHandableList используется классами, которые предоставляют большое количество событий для более эффективной обработки памяти, только выделяя пространство для Поэтому все события для основной формы хранятся там.

Я ожидаю, что дочерняя форма отслеживала, когда ее родитель может закрыться (это обычный случай использования) и она не отписалась от события FormClosing или FormClosed , когда она получила это событие. Однако, это всего лишь предположение. Чтобы подтвердить, просмотрите реализацию дочерней формы и найдите все случаи, когда она подписывается на события из родительской формы, а затем убедитесь, что имеется соответствующая отмена подписки на эти события.

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

-121--4407459-

Запись :: открыть вместо открыть . Префикс :: указывает, что имя должно быть взято из глобальной области. (Глобальное пространство имен? Я не уверен в его точном значении, если честно...)

8
ответ дан 2 December 2019 в 03:18
поделиться

добавить ":" до открытия (_portName. c_str(), O_RDWR | O_NOCTTY );

4
ответ дан 2 December 2019 в 03:18
поделиться