Рассмотрим следующий класс:
class Foo
{
enum Flags {Bar, Baz, Bax};
template<Flags, class = void> struct Internal;
template<class unused> struct Internal<Bar, unused> {/* ... */};
template<class unused> struct Internal<Baz, unused> {/* ... */};
template<class unused> struct Internal<Bax, unused> {/* ... */};
};
Схема класса выше компилируется и функционирует должным образом при тестировании на VC++ 2010 и Comeau C++. Однако, когда Foo
превращается в сам шаблон, приведенный выше фрагмент не работает в VC++ 2010.
Например, следующий фрагмент:
template<class> class Foo
{
// Same contents as the original non-templated Foo.
};
Выдает следующий класс ошибки:
C2754: 'Foo<<unnamed-symbol>>::Internal<Bar,unused>' : a partial specialization cannot have a dependent non-type template parameter
C2754: 'Foo<<unnamed-symbol>>::Internal<Baz,unused>' : a partial specialization cannot have a dependent non-type template parameter
C2754: 'Foo<<unnamed-symbol>>::Internal<Bax,unused>' : a partial specialization cannot have a dependent non-type template parameter
- Может ли кто-нибудь объяснить, что здесь происходит, на простом английском языке?
- Как это исправить (т. е. сохранить внутреннюю псевдоявную специализацию в шаблоне
Foo
) в VC++ 2010?
Foo
является шаблоном. Я предлагаю вам попробовать в одной из групп новостей MS. Люди, занимающиеся компиляцией MS, тусовались там. - person sbi   schedule 18.07.2010