использование объявлений и константных перегрузок - PullRequest
4 голосов
/ 09 августа 2011

Предположим, у меня есть две версии operator-> (перегружены на const) в базовом классе.Если я скажу

using Base::operator->;

в производном классе, получу ли я доступ к обеим версиям или только к неконстантной?

Ответы [ 3 ]

4 голосов
/ 09 августа 2011

То же дело, что и скрытие имени. Это все или ничего. Используя объявления (7.3.3), вы получите имя , а не member .

ИСО / МЭК 14882 (2003), 7.3.3. 1 / A использование-декларация вводит имя в декларативном регион, в котором появляется объявление об использовании. Это имя является синонимом для имени некоторой сущности, объявленной в другом месте.

Я призываю вас прочитать 7.3.3, внутри есть тонкие вещи. Вы не можете использовать-объявлять шаблон, все члены, на которые ссылается имя, которое вы используете-объявляете, должны быть доступны, имена учитываются для разрешения перегрузки вместе с именами в блоке, где находится объявление использования (т.е. они ничего не скрывают ) и т. д. и т. д.

3 голосов
/ 09 августа 2011

Вы получаете доступ ко всем версиям метода / оператора с одинаковым именем в этом родительском элементе.

2 голосов
/ 09 августа 2011

оба.ты пробовал это?(блин, этот ответ короткий: ну, вот пример:

#include <iostream>
#include <string>

struct bar
{
  void foo() { std::cout << "non_c:foo()" << std::endl; }
  void foo() const { std::cout << "c:foo()" << std::endl; }
};

class base
{
public:
  bar* operator->() { return &b; }
  bar const* operator->() const { return &b; }

private:
  bar b;  
};

class derived : public base
{
public:
  using base::operator->;
};


int main(void)
{
  const derived d = derived();
  derived e;

  d->foo();
  e->foo();
}
...