В C++ это нормально, чтобы иметь funcction, который принимает локальный тип функции:Почему шаблоны не могут использовать локальные типы?
int main() {
struct S { static void M(const S& s) { } };
S s;
S::M(s);
}
, но не ОК, чтобы иметь шаблон, который делает:
template<typename T> 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 paragraph 2 in the c++ standard.
Тип без привязки [...] не должны использоваться в качестве аргумента шаблона для параметра типа шаблона
Почему C++ запрещает это?
Лучшее объяснение, которое я слышал до сих пор это, что внутренние типы не имеют никакой связи между ними, и что это может означать, что функция, которая принимает их в качестве арг не должно быть никакой связи между ними. Но нет причин, по которым я вижу, что экземпляр шаблона должен иметь связь.
p.s. Пожалуйста, не просто скажите «thats not allowed because the standard says it's not»
Нет веской причины, и C++ 0x удалит это ограничение (но не тот, который связан с p.s; я до сих пор не знаю, почему это недопустимо). –
@Mike; Короче и точно! – BCS