Правила именования функций-членов класса C ++ - PullRequest
2 голосов
/ 10 февраля 2009

Я пытаюсь инкапсулировать некоторые функции из библиотеки сокетов C в свой собственный класс C ++. Я хотел бы определить функцию-член, которая использует то же имя, что и соответствующая ей функция C, но с другой сигнатурой. Например, я хотел бы написать функцию

ssize_t MyClass::write(const void *buf);

, который звонит на

ssize_t write(int fd, const void *buf, size_t count);

При компиляции я получаю следующие ошибки

error: no matching function for call to ‘MyClass::write(int&, const char*&, size_t)’
note: candidates are: ssize_t MyClass::write(const char*)

У меня есть правильные операторы #include для вызова библиотеки сокетов C, но мое определение функции записи, похоже, затеняет ее. Если я изменю имя своей функции, определенной классом, на что-то другое, то все будет работать нормально.

Я вполне уверен, что изменение имени моей функции будет моим окончательным решением, но кто-то может сказать мне имя правила именования C ++, которое вызывает такое поведение? Я хотел бы прочитать об этом, чтобы я знал, что я делаю в будущем.

Ответы [ 3 ]

6 голосов
/ 10 февраля 2009

Вы пытались вызвать функцию C, объясняя, что она живет в глобальном пространстве имен, например :: write?

2 голосов
/ 10 февраля 2009

Эта страница довольно неплохо описывает правила поиска имен в C ++. По сути, когда компилятор видит, что write() является функцией-членом класса, он не ищет глобальные функции с тем же именем. Затем он сообщает об ошибке, так как функция-член write() не имеет правильного числа и типов аргументов, которые вы указали. Использование унарного оператора разрешения области действия :: заставляет компилятор выполнять поиск только в глобальном пространстве имен для функций с именем write(), что затем завершается успешно.

1 голос
/ 10 февраля 2009

В более общем случае, когда компилятор отправляется на поиск функции, он сначала ищет в ближайшем пространстве имен, и если он находит одно с правильным именем, он не смотрит дальше, даже если сигнатуры не совпадают.

...