Since you're only using "Buffer" type indirectly, i.e., as a "Buffer *" (ptr-to-Buffer), I suppose you could try a workaround (if you're willing to change your ConstantBuffer class), with forward declaration of "SMatrixBuffer" and using "SMatrixBuffer *" as a template argument in the instantiation. Beforehand, you'd need an explicit template instantiation in the same translation unit (extra or existing file, whatever you find most convenient) that has access to the forward-declared template argument.
For more details / examples, see:
Since you're only ever going to use incomplete types, this will even work with smart pointers, like std::unique_ptr (using which you should strongly consider, since it's zero-overhead anyway -- otherwise, by leaving raw pointers everywhere you're keeping your ownership semantics assumptions unstated, undocumented, and unenforced, which is rather bad):
If it sounds involved, it's because it is ;-) If you're fine with moving to a header-only template implementation, it's probably the simpler / recommended way.
In any case, reconsider using raw pointers, http://klmr.me/slides/modern-cpp/ ;-)