Использование -> в шаблоне, чтобы заставить следующий символ быть зависимым - PullRequest
4 голосов
/ 28 ноября 2011

Из вопроса:

Правильное использование ->

Ответ гласит, что -> можно использовать

... в шаблоне, чтобы следующий символ был зависимый - в последнем случае это часто неизбежно.

Что это значит, что будет хорошим примером этого использования? Я не совсем понимаю, что означает «зависимый» в этом контексте, но это звучит как полезная уловка.

Ответы [ 3 ]

12 голосов
/ 28 ноября 2011

Опубликовано в другом вопросе:

template <class T>
struct foo : T {
  void bar() {
    x = 5;       // doesn't work
    this->x = 5; // works - T has a member named x
  }
};

Без this-> Компилятор не знает x является (унаследованным) членом.

Аналогично использованию typename иtemplate внутри кода шаблона:

template <class T, class S>
struct foo : T {
  typedef T::ttype<S>; // doesn't work
  typedef typename T::template ttype<S> footype; // works
};

Это глупо и несколько ненужно, но вы все равно должны это сделать.

5 голосов
/ 28 ноября 2011
template <typename T>
struct Base
{
  void foo() {}
};

template <typename T>
struct Derived : Base<T>
{
  void bar()
  {
    // foo();  //foo() is a dependent name, should not call it like this
    // Base<T>::foo(); //This is valid, but prevents dynamic dispatch if foo is virtual
    this->foo(); //use of this-> forces foo to be evaluated as a dependent name
  }
};

Более подробное объяснение доступно в C ++ FAQ

0 голосов
/ 29 ноября 2011

См. Использование этого ключевого слова в деструкторе [закрыто] .

Это уродливо, но это уродство напрямую связано с общими правилами связывания имен "современных" шаблонов (в отличие от макроподобных шаблонов, реализованных в MS).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...