В C ++ нормально иметь функцию, которая принимает функцию локального типа:
int main() {
struct S { static void M(const S& s) { } };
S s;
S::M(s);
}
, но не нормально иметь шаблон, который выполняет:
template void Foo(const T& t) { }
int main() {
struct S { } s;
Foo(s); // Line 5: error: no matching function for call to 'Foo(main()::S&)'
}
14.3. 1 абзац 2 стандарта C ++.
Тип без связи [...] не должен использоваться в качестве аргумента шаблона для параметра типа шаблона
Почему C ++ запрещает это?
Лучшее объяснение, которое я слышал до сих пор, что внутренние типы не имеют связи и что это может означать, что функция, которая принимает их как аргумент, не должна иметь связи. Но нет причин, по которым я могу видеть, что экземпляр шаблона должен иметь связь.
ps Пожалуйста, не говорите просто « это запрещено, потому что стандарт говорит, что это не »