2009-02-10 3 views
2

Я пытаюсь инкапсулировать некоторые функции из библиотеки сокетов C в свой собственный класс 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++, которое вызывает это поведение? Я хотел бы прочитать об этом, чтобы я знал, что я делаю в будущем.

ответ

6

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

1

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

2

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

Смежные вопросы