Могу ли я использовать использование внутри FNC Def? - PullRequest
0 голосов
/ 18 октября 2011

У меня есть конструкция этой формы:

template<class X>
struct Base
{
  X get_data()
  {
    return X();
  }
};

template<class X>
struct Derived : Base<X>
{
  X do()
  {
    auto v = get_data();//this get is from Base
  }

};

Я пытался использовать этот метод get, как показано, но получал ошибку: нет аргументов для get_data, которые зависят от параметра шаблона, поэтому должно быть доступно объявление get_data [-fpermissive] |
Итак, я попробовал:

X do()
{
  using Base<T>::get_data;
  auto v = get_data();//this get is from Base
}

И у меня есть следующее error: 'Derived<T>::Base' is not a namespace. Теперь, здесь у меня есть проблема, потому что формально Base как структура является пространством имен (особая форма), но в любом случае я объявил использование Base<T>::get_data; вне любого fnc, и это компилируется. Итак, вопрос таков: допускается ли ошибка компилятора или использование 'using объявление' внутри тела fnc?

Ответы [ 3 ]

1 голос
/ 18 октября 2011
auto v = this->get_data();

1 голос
/ 18 октября 2011

using Директивы для имен членов базового класса имеют смысл только на уровне класса, где они служат для отображения имен членов базового класса, которые в противном случае могли бы быть скрыты.

Они не имеют смысла в области действия функции и поэтому не допускаются туда.

Что вы можете сделать, это:

struct Derived : public Base<X>
{
  using Base<X>::get_data;
  //...
};

(Это имеет смысл только из-за контекста шаблона и того факта, что get_data() не зависит от каких-либо параметров шаблона. В обычном классе это вообще не понадобится, если вы не намеренно скрываете функция.)

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

Также обратите внимание, что do является ключевым словом C ++.

1 голос
/ 18 октября 2011

Заменить

using Base<T>::get_data;

с

using Base<X>::get_data;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...