Вы правы, что C ++ 03 не позволяет использовать тип с внутренней связью в качестве параметра типа шаблона, в то время как C ++ 11 делает это.
Однако я напоминаю, что определениявнутри анонимного пространства имен все еще есть внешняя связьэто имя
- объекта, ссылки, функции или шаблона функции, который явно объявлен как статический, или,
- объекта или ссылки, которые явно объявлены
const
и не объявлены явноextern
и ранее не было заявлено о наличии внешней связи;или - член данных анонимного объединения.
Имя с областью пространства имен имеет внешнюю связь, если это имя
- объекта илиссылка, если она не имеет внутренней связи;или
- функция, если она не имеет внутренней связи;или
- именованный класс (раздел 9) или безымянный класс, определенный в объявлении typedef, в котором класс имеет имя typedef для целей связывания (7.1.3);или
- именованное перечисление (7.2) или неназванное перечисление, определенное в объявлении typedef, в котором перечисление имеет имя typedef для целей связывания (7.1.3);или
- перечислитель, принадлежащий перечислению с внешней связью;или
- шаблон, если это не шаблон функции с внутренней связью (пункт 14);или
- пространство имен (7.3), если оно не объявлено в безымянном пространстве имен.
У вас есть именованный класс в области пространства имен, он имеет внешнюю связь.
И в сноске внизу страницы 115 ИСО / МЭК 14882: 2003 поясняется:
Хотя объекты в безымянном пространстве имен могут иметь внешнюю связь, они эффективно квалифицируются уникальным именемк их единице перевода и, следовательно, никогда не будет видно из любой другой единицы перевода.
Если у вас есть другая версия, попробуйте заглянуть в раздел 7.3.1.1 [namespace.unnamed]