LINUX.ORG.RU

[C++][templates][inheritance] непонятно...

 


0

0

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

сначало собственно код:

// собственно базовый класс
template <class T1, class T2>
class base
{
protected:
  T1 data;
...
public:
...
  virtual void test () = 0;
};

// класс потомок
template <class T1, class T2>
class derived : public base<T1, T2>
{
...
public:
  void test ()
  {
    data.somefun (); собственно тут и проблема
  }
};

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

  void test ()
  {
    base<T1, T2>::data.somefun ();
  }

собственно вопрос, почему так? :)

Зарание всем благодарен.

Можно this->data.somefun()

Компилятор не знает где искать член data , надо указать явно что он будет унаследован .

kitov ★★★
()
Ответ на: комментарий от kitov

Как это компилятор не знает? А нафига я указываю базовый класс в обявлении потомка? Разве не должен в таком случае компилятор наследовать все что есть в базовом? Я чего-то видимо глобального не понимаю в таком случае... :)

Cy6erBr4in ★★★
() автор топика

>собственно вопрос, почему так?

по стандарту компилятор не должен выполнять поиск независимых имён в зависимых базовых классах; при этом разрешение имени должно произойти безотлагательно

читай "Шаблоны C++" Вандевурда/Джосаттиса, раздел 9.4.2 (зависимые базовые классы); либо раздел стандарта, посвящённый разрешению имён в шаблонах

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

jtootf ★★★★★
()
Ответ на: комментарий от Reset

Аха! Вот оно! Спасибо большое!

Спасибо всем, теперь гораздо понятнее.

P.S.: Erlang раслабляет... :)

Cy6erBr4in ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.