Ошибка C++: базовая функция защищена

Я хотел бы знать, почему следующий код не компилируется:

class base {
protected:
  typedef void (base::*function_type)() const;
  void function_impl() const {} // error: ‘void base::function_impl() const’ is protected
};

class derived: public base {
public:
  operator function_type() const {
    return boolean_test() == true ? &base::function_impl : 0; // error: within this context
  }

protected:
  virtual bool boolean_test() const = 0;
  virtual ~derived() {}
};

int main(int argc, char* argv[]) {
}

g++ выход:

~/protected_test$ g++ src/protected_test.cpp
src/protected_test.cpp: In member function ‘derived::operator base::function_type() const’:
src/protected_test.cpp:4:8: error: ‘void base::function_impl() const’ is protected
src/protected_test.cpp:10:44: error: within this context

Этот код был адаптирован отсюда, и я не вижу никого, кто бы жаловался на это на форуме. Кроме того, я использую g++ 4.7.2, и тот же код компилируется и ссылки прекрасно с egcs-2.91.66.

1 ответ

Решение

Спецификация защищенного доступа гласит, что указатель на члены должен быть сформирован либо через производный тип (т.е. derived::...) или тип, унаследованный от него. Вы не можете назвать function_impl прямо через base,

Это означает, что в вашем случае вы должны сделать это как

operator function_type() const {
  return boolean_test() == true ? &derived::function_impl : 0;
}

Обратите внимание, что даже если вы используете &derived::function_impl выражение для получения адреса, тип результата по-прежнему void (base::*function_type)() const, так как имя function_impl в этом случае разрешает функцию base учебный класс.

Если он использовался для компиляции в каком-то конкретном компиляторе (или какой-то конкретной версии), это просто означает, что этот компилятор позволил ошибке проскользнуть, что, вероятно, объясняет код по ссылке.

Другие вопросы по тегам