Использование объявления в производном от шаблона классе, не распознанном g

#c #c 11 #gcc

#c #c 11 #gcc

Вопрос:

Следующий код не компилируется с g 4.9, 5.4 и 6.2.

 template <class T, int M, int N>
struct Matrix { };

template <typename T> struct Traits;
class Derived;

template <>
struct Traits<Derived>
{
  static constexpr int N= 3;
};

template <typename T>
class Base: public Traits<T>
{
protected:
  using Traits<T>::N;
  static const Matrix<double,N,N> Mat;
};

template <typename T>
const Matrix<double,Base<T>::N,Base<T>::N> Base<T>::Mat;

class Derived: public Base<Derived> {};

int main()
{
Derived foo;
}
  

Я получаю сообщение об ошибке ‘const Matrix<double, #‘using_decl’ not supported by dump_expr#<expression error>, #‘using_decl’ not supported by dump_expr#<expression error>, (AutoAlign | (((#‘using_decl’ not supported by dump_expr#<expression error> == 1) amp;amp; (#‘using_decl’ not supported by dump_expr#<expression error> != 1)) ? RowMajor : (((#‘using_decl’ not supported by dump_expr#<expression error> == 1) amp;amp; (#‘using_decl’ not supported by dump_expr#<expression error> != 1)) ? ColMajor : ColMajor))), #‘using_decl’ not supported by dump_expr#<expression error>, #‘using_decl’ not supported by dump_expr#<expression error> > Base<T>::Mat .

Я не понимаю, что не так. Может кто-нибудь помочь?

Обходной путь состоит из:

 template <typename T>
class Base: public Traits<T>
{
protected:
  static constexpr auto N= Traits<T>::N;
  static const Matrix<double,N,N> Mat;
};
  

Комментарии:

1. Я полагаю, что часть того, что вы видите, — это просто сообщение об ошибке, которое не может создать сообщение об ошибке. это часть «#‘using_decl’, не поддерживаемая dump_expr #»

2. Я подтверждаю проблему с clang 3.5: ошибка заключается в «переопределении ‘Mat’ с другим типом: ‘const Matrix<[…], Base<T>::N, Base<T>::N>’ против ‘const Matrix<[…], N, N>'»

3. Проблема заключается в одном из зависимых имен, но я не уверен, как это исправить. Компилятор не знает, что они одинаковы. Я думаю, что это включает в себя добавление «шаблона» еще в несколько мест, но я не уверен, почему.