template<typename T, std::size_t n>
class squareMatrix {
public:
void invert();
};
squareMatrix<double, 5> sm1;
sm1.invert();
squareMatrix<double, 10> sm2;
sm2.invert();
two copies of invert will be instantiated here. This is a classic way for template-induced code bloat to arise.
template<typename T>
class SquareMatrixBase{
protected:
SquareMatrixBase(std::size_t n, T *pMem): size(n), pData(pMem) { }
void setDataPtr(T* ptr) { pData = ptr; }
private:
std::size_t size;
T *pData;
};
template<typename T, std::size_t n>
class SquareMatrix: private SquareMatrixBase<T> {
public:
squareMatrix(): SquareMatrixBase<T>(n, data) {}
private:
T data[n*n];
};
put the data for each matrix on the heap
template<typename T, std::size_t n>
class SquareMatrix: private SquareMatrixBase<T> {
public:
SquareMatrix(): SquareMatrixBase<T>(n, 0), pData(new T[n*n]) {
this->setDataPtr(pData.get());
}
private:
boost::scoped_array<T> pData;
};
These functions use the “this->” notation, because function names in templatized base classes are hidden from derived classes.
但是在vs2017 中没有 “this->” 也是可以编译通过的。