Подтвердить что ты не робот

.template(dot-template) использование конструкции

Возможный дубликат:
Где и почему мне нужно поставить ключевые слова "template" и "typename" ?

Я столкнулся с странным сегментом кода:

#include <iostream>

template <int N>
struct Collection {
  int data[N];

  Collection() {
    for(int i = 0; i < N; ++i) {
      data[i] = 0;
    }
  };

  void SetValue(int v) {
    for(int i = 0; i < N; ++i) {
      data[i] = v;
    }
  };

  template <int I>
  int GetValue(void) const {
    return data[I];
  };
};

template <int N, int I>
void printElement(Collection<N> const & c) {
  std::cout << c.template GetValue<I>() << std::endl; /// doesn't compile without ".template"
}

int main() {
  Collection<10> myc;
  myc.SetValue(5);
  printElement<10, 2>(myc);
  return 0;
}

Он не скомпилирован без ключевого слова .template в функции printElement. Я никогда не видел этого раньше, и я не понимаю, что нужно. Пытаясь удалить его, у меня появилось много ошибок компиляции, связанных с шаблонами. Так мой вопрос, когда такая конструкция используется? Это распространено?

4b9b3361

Ответ 1

GetValue - зависимое имя, поэтому вам нужно явно указать компилятору, что следующее c является шаблоном функции, а не некоторыми данными-членами. Вот почему вам нужно написать ключевое слово template, чтобы устранить эту проблему.

Без template ключевого слова следующие

c.GetValue<I>()  //without template keyword

можно интерпретировать как:

//GetValue is interpreted as member data, comparing it with I, using < operator
((c.GetValue) < I) > () //attempting to make it a boolean expression

то есть < интерпретируется как меньший, чем оператор, а > интерпретируется как оператор большего, чем оператор. Вышеприведенная интерпретация, конечно, неверна, поскольку она не имеет смысла и, следовательно, приведет к ошибке компиляции.

Подробнее об этом читайте здесь: