Intereting Posts
C ++ Связанный список уничтожить функцию инициализация / назначение структуры с помощью фигурных скобок Изменение Контекстной версии OpenGL для QGLWidgets в Qt 4.8.6 на OS X Как «посмотреть» размер C ++ std :: vector в gdb? getline игнорирует первый символ ввода строки Как убедиться, что std :: random_shuffle всегда производит другой результат? Является ли объявление явно дефолтного конструктора перемещения в каждом classе, который не обеспечивает определенную пользователем правильную практику? Использование и .so и .dll в Windows Специализация шаблонов classов с общей функциональностью SFINAE и decltype (авто) Обнаружение использования после free () на windowsх. (оборванные указатели) Почему float не является двойным в 64-битной системе? Как увеличить :: range :: sort () boost :: transform_range? Когда std :: chrono epoch? Понимание «наиболее неприятного parsingа» – зачем допускать неоднозначный синтаксис?

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

Возможный дубликат:
Где и почему мне нужно поставить ключевые слова «шаблон» и «имя-тип»?

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

#include  template  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 GetValue(void) const { return data[I]; }; }; template  void printElement(Collection const & c) { std::cout << c.template GetValue() << std::endl; /// doesn't compile without ".template" } int main() { Collection myc; myc.SetValue(5); printElement(myc); return 0; } 

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

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

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

 c.GetValue() //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 

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

Для более подробного объяснения прочитайте принятый ответ здесь:

  • Где и почему мне нужно поставить ключевые слова «шаблон» и «имя-тип»?