template <typename T>
struct A
{
template <typename U>
struct B;
template <>
struct B<int> {static const int tag = 1;}; // Works fine in VS2010
};
Как я могу специализироваться B таким же образом, но за пределами А. Я попытался это, но безуспешно:Специализация класса членов вложенного в неспециализированном классе
template <typename T> template <>
struct A<T>::B<int> {static const int tag = 1;};
я получаю:
error C3212: 'A<T>::B<int>' : an explicit specialization of a template member must be a member of an explicit specialization
Это не имеет смысла, так как я могу сделать именно это, определив его внутри класса
VS2010 проблема? Неправильный синтаксис?
Благодаря
PS: Это один (который должен быть неправильно в любом случае, аварии VS2010):
template <> template <typename T>
struct A<T>::B<int> {static const int tag = 1;};
Спасибо. Любая идея, почему исключение? Концептуально было бы приемлемо разрешить это. – Frigg
@ Frigg- Если бы мне пришлось угадать , было бы предотвращение двусмысленностей между наличием внешней специализации с внутренним шаблоном и внешний шаблон с внутренней специализацией, но я понятия не имею. Я не знал, что это незаконно, пока вы не разместили вопрос. :-) – templatetypedef
Для моего ограниченного ума это не кажется очень двусмысленным. Мне трудно представить, как они добавляют исключение именно для этого. Любое исключение порождает проблемы, с ними больше двусмысленности, чем без них (как в этом случае, если вы спросите меня). :( – Frigg