Почему шаблоны не могут быть объявлены в функции?

Чтение Шаблонов C++: в полном руководстве и этом говорится

Обратите внимание, что шаблоны не могут быть объявлены в функции

Это не дает объяснение и/или перекрестную ссылку ни на какую другую главу в книге или внешнем ресурсе.

Мог кто-то помогать в объяснении этого. Вероятно, это объяснено позже в книге, но не там все же. Если объяснено ранее, я, должно быть, пропустил его.

Пример:

int main()
{
  class DummyClass  //  This compiles ok
  {
    int object;
  };

  template  //  compile error "expected primary-expression before "template""
  class DummyTemplate
  {
    T object;
  };

  return 0;
}

Я не понимаю сообщение об ошибке от gcc также. В сообщении об ошибке говорится:

expected primary-expression before "template"

23
задан dubnde 10 August 2010 в 13:25
поделиться

4 ответа

Это означает, что вы не можете делать что-то вроде следующего

  void foo()
  {
       template <typename T> //Error
       T something;
  }

Объявления шаблонов разрешены только в глобальной области, пространстве имен или области класса. :)

Какова причина этого?

Это запрещено, потому что так сказано в Стандарте.

ISO C ++ - 98 ( Раздел 14.2 )

Объявление шаблона может появляться только как объявление пространства имен или области класса.

Есть ли в этом смысл?

3
ответ дан 29 November 2019 в 01:40
поделиться

Краткий ответ на вопрос, почему это так, состоит в том, что так хотели этого парни, написавшие компиляторы и стандарты c / c ++. Шаблоны внутри функций должны были быть сочтены слишком хаотичными и / или трудными для понимания или синтаксического анализа, поэтому они запретили это.

2
ответ дан 29 November 2019 в 01:40
поделиться

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

1
ответ дан 29 November 2019 в 01:40
поделиться

В чем именно будет польза? Чтобы вы могли объявить шаблонные переменные, которые можно использовать только внутри функции? Это действительно полезно?

0
ответ дан 29 November 2019 в 01:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: