Ответ 1
В С++ 03 аргументы шаблона не могут иметь внутренней связи:
[C++03: 14.6.4.2/1]:
Для вызова функции, который зависит от параметра шаблона, если имя функции является неквалифицированным идентификатором, но не идентификатором шаблона, функции-кандидаты обнаруживаются с использованием обычных правил поиска (3.4.1, 3.4. 2), за исключением того, что:
- Для части поиска, использующей поиск неквалифицированного имени (3.4.1), найдены только объявления функций с внешней привязкой из контекста определения шаблона.
- Для части поиска с использованием связанных пространств имен (3.4.2) найдены только объявления функций с внешней связью, найденные либо в контексте определения шаблона, либо в контексте создания шаблона.
[..]
Это было изменено (вопрос # 561: "Внутренние функции привязки в зависимом поиске имен" ) в С++ 11:
[C++11: C.2.6]:
14.6.4.2
Изменить: разрешить зависимые вызовы функций с внутренней связью
Обоснование: Слишком ограниченные, упрощают правила разрешения перегрузки.
в результате:
[C++11: 14.6.4.2/1]:
Для вызова функции, зависящего от параметра шаблона, функции-кандидата найдены с использованием обычных правил поиска (3.4.1, 3.4.2, 3.4.3), за исключением того, что:
- Для части поиска, использующей поиск неквалифицированного имени (3.4.1) или поиск квалифицированного имени (3.4.3), отображаются только объявления функций из контекста определения шаблона.
- Для части поиска с использованием связанных пространств имен (3.4.2) найдены только объявления функций, найденные в контексте определения шаблона или контекста создания шаблона.
[..]
(Определите недостающую "внешнюю привязку" ).
Поскольку ваш main()::ComparitorInner&
имеет внутреннюю привязку, а для экземпляра std::sort
требуется, чтобы этот тип был параметром шаблона (хотя и выведенным), ваш код действителен только в С++ 11.