2011-02-02 2 views
0
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;}; 

ответ

2

Цитирую C++ спецификации, § 14.17.3.18:

В явном объявлении специализации для члена шаблона класса или шаблон-член, который появляется в области пространства имен, шаблон-член и некоторые из его вмещающих шаблонов классов могут оставаться неспециализированными, , за исключением того, что декларация не должна явно специализировать шаблон члена класса, если его встроенные шаблоны классов также явно не специализированы, а также. [...]

(курсив мой)

Это говорит о том, что вы не можете специализировать шаблонный класс вложен внутри другого класса шаблона, если внешний класс шаблон не специализирован, а также. Таким образом, похоже, что VS2010 имеет такое поведение неправильно, и g ++ имеет это право.

+0

Спасибо. Любая идея, почему исключение? Концептуально было бы приемлемо разрешить это. – Frigg

+0

@ Frigg- Если бы мне пришлось угадать , было бы предотвращение двусмысленностей между наличием внешней специализации с внутренним шаблоном и внешний шаблон с внутренней специализацией, но я понятия не имею. Я не знал, что это незаконно, пока вы не разместили вопрос. :-) – templatetypedef

+0

Для моего ограниченного ума это не кажется очень двусмысленным. Мне трудно представить, как они добавляют исключение именно для этого. Любое исключение порождает проблемы, с ними больше двусмысленности, чем без них (как в этом случае, если вы спросите меня). :( – Frigg

1

Это просто не работает таким образом. :-(

Вы не можете специализироваться функцию внутри объявления класса, даже если MSVC принимает это с настройками по умолчанию.

Вы также не можете специализироваться члена функции, не специализируясь также на охватывающем классе. Большинство компиляторов отвлекаются на это (как и на языке).