Зависимые шаблонные параметры нетипа

Рассмотрите следующий класс:

class Foo
{
  enum Flags {Bar, Baz, Bax};

  template struct Internal;

  template struct Internal {/* ... */};
  template struct Internal {/* ... */};
  template struct Internal {/* ... */};
};

Схема класса выше компилирует и функции как ожидалось при тестировании на VC ++ 2010 и C++ Comeau. Однако, когда Foo превращен в сам шаблон, вышеупомянутые повреждения отрывка под VC ++ 2010.

Например, следующий отрывок:

template class Foo
{
  // Same contents as the original non-templated Foo.
};

Приводит к следующему ошибочному классу:

C2754: 'Foo<>::Internal' : a partial specialization cannot have a dependent non-type template parameter
C2754: 'Foo<>::Internal' : a partial specialization cannot have a dependent non-type template parameter
C2754: 'Foo<>::Internal' : a partial specialization cannot have a dependent non-type template parameter

  1. Кто-то может объяснить, что продолжается здесь без обиняков?
  2. Как я могу зафиксировать это (т.е. сохранить внутренние псевдоявные специализации в шаблонном Foo) на VC ++ 2010?

10
задан rybz 18 July 2010 в 17:53
поделиться

1 ответ

Как я могу это исправить (т.е. сохранить внутренние псевдоявные специализации в шаблонном Foo) в VC ++ 2010?

Вы можете сделать тип перечисления независимым, объявив его в не шаблонный базовый класс (C ++ 03 сделал вложенные классы зависимыми в # 108 , но это не включает перечисление, но даже если такой код все равно будет законным).

struct FooBase { 
  enum Flags {Bar, Baz, Bax};
};

template<class> class Foo : public FooBase {
  template< ::FooBase::Flags, class = void > struct Internal;
  // same other stuff ...
};

Ссылка «класс ошибки» уже дает описание предполагаемых случаев, когда ошибка должна возникать.Ошибка предполагает, что все зависимые типы запрещены, но на самом деле это то, что стандарт говорит:

Тип параметра шаблона, соответствующий специализированному аргументу, не являющемуся типом, не должен зависеть от параметра специализации.

Таким образом, даже если имя Flags будет каким-то образом зависимым, это не сделает его некорректным до тех пор, пока оно не зависит от параметра специализации, как в примере вашего " класс ошибки "ссылка.

4
ответ дан 4 December 2019 в 04:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: