Чтение Шаблонов 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"
Это означает, что вы не можете делать что-то вроде следующего
void foo()
{
template <typename T> //Error
T something;
}
Объявления шаблонов разрешены только в глобальной области, пространстве имен или области класса. :)
Какова причина этого?
Это запрещено, потому что так сказано в Стандарте.
ISO C ++ - 98 ( Раздел 14.2 )
Объявление шаблона может появляться только как объявление пространства имен или области класса.
Есть ли в этом смысл?
Краткий ответ на вопрос, почему это так, состоит в том, что так хотели этого парни, написавшие компиляторы и стандарты c / c ++. Шаблоны внутри функций должны были быть сочтены слишком хаотичными и / или трудными для понимания или синтаксического анализа, поэтому они запретили это.
Единственный раз, когда это было бы полезно, было бы, если бы вы создали несколько экземпляров шаблона с разными типами с помощью одной функции. В любом случае переместите свои частные классы из своих функций. Если это начинает загромождать ваши классы, значит, они слишком велики и нуждаются в рефакторинге.
В чем именно будет польза? Чтобы вы могли объявить шаблонные переменные, которые можно использовать только внутри функции? Это действительно полезно?