// PR c++/53581 template<class A, int M, int N> class Child; template<class A, int M, int N> class Base { public: Child<A, M, N> operator-(const Base<A, M, N> &m) const { Child<A, M, N> diff; return diff; } A test() const { return 0; } private: A values[M * N]; }; template<class A, int N> class Ops { public: virtual ~Ops() {} bool bar() const { Child<A, N, N> mat; return (*static_cast<const Child<A, N, N>*>(this) - mat).test(); } }; template<class A, int N> class Child<A, N, N> : public Base<A, N, N>, public Ops<A, N> {}; class ImageWarp { bool bar() const { return foo.bar(); } Child<float, 3, 3> foo; };