Я создаю простой класс C++ шаблона матрицы, со следующим определением:C++ шаблона матрица класс - квадратная матрица специализация
template<uint n, uint m, typename T = double>
class Matrix {
private:
T data[n][m];
static Matrix<n, m, T> I;
public:
Matrix();
Matrix(std::initializer_list<T> l);
T& at(uint i, uint j); // one-based index
T& at_(uint i, uint j); // zero-based index
template<uint k> Matrix<n, k, T> operator*(Matrix<m, k, T>& rhs);
Matrix<m, n, T> transpose();
Matrix<n, m, T> operator+(const Matrix<n, m, T>& rhs);
Matrix<n, m, T>& operator+=(const Matrix<n, m, T>& rhs);
Matrix<n, m, T> operator-(const Matrix<n, m, T>& rhs);
Matrix<n, m, T>& operator-=(const Matrix<n, m, T>& rhs);
Matrix<n, m, T> operator*(const T& rhs);
Matrix<n, m, T>& operator*=(const T& rhs);
Matrix<n, m, T> operator/(const T& rhs);
Matrix<n, m, T>& operator/=(const T& rhs);
static Matrix<n, m, T> identity();
};
(uint
определяются как unsigned int
)
Окончательные функция Matrix<n, m, T> identity()
стремится вернуть статический элемент I
, который является идентификационной матрицей, используя базовый одноэлементный шаблон. Очевидно, что матрица определена только для квадратных матриц, поэтому я попытался это:
template<uint n, typename T>
inline Matrix<n, n, T> Matrix<n, n, T>::identity() {
if (!I) {
I = Matrix<n, n, T>();
for (uint i = 0; i < n; ++i) {
I.at(i, i) = 1;
}
}
return I;
}
который дает ошибку C2244 'Matrix<n,n,T>::identity': unable to match function definition to an existing declaration
.
Мое впечатление, что я мог бы сделать какую-то специализацию шаблона, где количество столбцов и строк равно. Я не уверен, что это возможно, но ваша помощь будет высоко оценена.
Это не сработает. Создание экземпляра 'Matrix' с n! = M приведет к созданию экземпляра функции, которая плохо сформирована при n! = M. Вы должны быть немного более тонким. – Brian
@Brian, вы правы, он не компилируется. Я не понимаю, почему SFINAE не использует и не игнорирует функцию. Во всяком случае, отредактированный мой ответ, static_assert, похоже, работает и даже дает лучшее сообщение об ошибке – tkausl
SFINAE возникает только при сбое замены при выводе аргумента шаблона. – Brian