.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. Я никогда не видел этого раньше, и я не понимаю, что нужно. Пытаясь удалить его, у меня появилось много ошибок компиляции, связанных с шаблонами. Так мой вопрос, когда такая конструкция используется? Это распространено?
Ответы
Ответ 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
то есть <
интерпретируется как меньший, чем оператор, а >
интерпретируется как оператор большего, чем оператор. Вышеприведенная интерпретация, конечно, неверна, поскольку она не имеет смысла и, следовательно, приведет к ошибке компиляции.
Подробнее об этом читайте здесь: