C++ 在g+;无法识别的模板派生类中使用声明+;

C++ 在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

以下代码无法使用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;
}
模板
结构矩阵{};
模板结构特征;
类派生;
模板
结构特征
{
静态constexpr int N=3;
};
模板
阶级基础:公共特征
{
受保护的:
使用性状::N;
静态常数矩阵矩阵;
};
模板
常数矩阵基::Mat;
派生类:公共基{};
int main()
{
衍生食品;
}
我收到错误消息
'const Matrix Base::Mat

我不明白怎么了。有人能帮忙吗

解决方案包括:

template <typename T>
class Base: public Traits<T>
{
protected:
  static constexpr auto N= Traits<T>::N;
  static const Matrix<double,N,N> Mat;
};
模板
阶级基础:公共特征
{
受保护的:
静态constexpr auto N=Traits::N;
静态常数矩阵矩阵;
};

我相信您看到的部分原因是错误报告器无法为错误创建消息。这就是“dump_expr不支持使用_decl”的第三部分:我用clang++3.5确认问题:错误是“用不同的类型重新定义'Mat':'const Matrix'vs'const Matrix'”。问题是一个依赖名称,但我不确定如何修复它。编译器不知道它们是相同的。我认为这涉及到在更多的地方抛出“模板”,但我不确定为什么。