次の Matrix クラスを作成しました。
template <typename T>
class Matrix
{
static_assert(std::is_arithmetic<T>::value,"");
public:
Matrix(size_t n_rows, size_t n_cols);
Matrix(size_t n_rows, size_t n_cols, const T& value);
void fill(const T& value);
size_t n_rows() const;
size_t n_cols() const;
void print(std::ostream& out) const;
T& operator()(size_t row_index, size_t col_index);
T operator()(size_t row_index, size_t col_index) const;
bool operator==(const Matrix<T>& matrix) const;
bool operator!=(const Matrix<T>& matrix) const;
Matrix<T>& operator+=(const Matrix<T>& matrix);
Matrix<T>& operator-=(const Matrix<T>& matrix);
Matrix<T> operator+(const Matrix<T>& matrix) const;
Matrix<T> operator-(const Matrix<T>& matrix) const;
Matrix<T>& operator*=(const T& value);
Matrix<T>& operator*=(const Matrix<T>& matrix);
Matrix<T> operator*(const Matrix<T>& matrix) const;
private:
size_t rows;
size_t cols;
std::vector<T> data;
};
std::complex の行列を使用しようとしました:
Matrix<std::complex<double>> m1(3,3);
問題は、コンパイルが失敗することです (static_assert が失敗します)。
$ make
g++-mp-4.7 -std=c++11 -c -o testMatrix.o testMatrix.cpp
In file included from testMatrix.cpp:1:0:
Matrix.h: In instantiation of 'class Matrix<std::complex<double> >':
testMatrix.cpp:11:33: required from here
Matrix.h:12:2: error: static assertion failed:
make: *** [testMatrix.o] Error 1
std::complex が算術型でないのはなぜですか? unsigned int (N)、int (Z)、double (R)、std::complex (C)、および自作のクラス (Q を表すクラスなど) を使用できるようにしたい...この振る舞いを取得しますか?
EDIT 1:static_assert
クラスを削除すると、正常に動作します。
Matrix<std::complex<double>> m1(3,3);
m1.fill(std::complex<double>(1.,1.));
cout << m1 << endl;