#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. Проблема заключается в одном из зависимых имен, но я не уверен, как это исправить. Компилятор не знает, что они одинаковы. Я думаю, что это включает в себя добавление «шаблона» еще в несколько мест, но я не уверен, почему.