Рассмотрите следующий класс:
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
Foo
) на VC ++ 2010?Как я могу это исправить (т.е. сохранить внутренние псевдоявные специализации в шаблонном 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
будет каким-то образом зависимым, это не сделает его некорректным до тех пор, пока оно не зависит от параметра специализации, как в примере вашего " класс ошибки "ссылка.