Matrix.h: In copy constructor 'mathematic::Matrix::Matrix(const mathematic::Matrix&)':
Matrix.h:6:42: error: class 'mathematic::Matrix' does not have any field named 'mathBasic'
Matrix::Matrix(const Matrix& mat): mathBasic(mat.mathBasic::row(), mat.mathBasic::column()) {
^~~~~~~~
mathBasic 是基類類型名稱,而非成員變數名稱。繼承關係中,派生類 包含 基類子物件,但不以類名作為成員名。
// ❌ 錯誤:嘗試用類名存取基類成員
Matrix(const Matrix& mat) : mathBasic(mat.mathBasic::row(), mat.mathBasic::column()) { ... }
// ✅ 正確:直接呼叫基類建構函數
Matrix(const Matrix& mat) : mathBasic(mat.row(), mat.column()) { ... }
// ✅ 更佳:使用基類複製建構函數(若基類正確實作)
Matrix(const Matrix& mat) : mathBasic(mat) { ... }
在模板派生類中存取基類成員,需處理相依名稱問題:
template <typename T>
class Matrix : public mathBasic<T> {
public:
// 需加上 this-> 或 基類名:: 才能讓編譯器在實例化階段查找
void foo() {
this->row(); // ✅ 正確
mathBasic<T>::row(); // ✅ 正確
row(); // ❌ 錯誤:非相依名稱,定義階段查找失敗
}
};
namespace mathematic {
template <typename T>
class mathBasic {
protected: // 改為 protected 讓派生類直接存取
int column_n, row_n;
T** element;
public:
mathBasic(int r = 0, int c = 0);
virtual ~mathBasic();
int row() const { return row_n; }
int column() const { return column_n; }
// ... 其他介面
};
template <typename T>
class Matrix : public mathBasic<T> {
public:
// 複製建構函數:正確呼叫基類複製建構函數
Matrix(const Matrix<T>& mat) : mathBasic<T>(mat) {}
// 移動建構函數(C++11)
Matrix(Matrix<T>&& mat) noexcept : mathBasic<T>(std::move(mat)) {}
// 指定維度建構
Matrix(int r, int c) : mathBasic<T>(r, c) {}
// 矩陣乘法:返回值優化 (RVO) 友善
Matrix<T> operator*(const Matrix<T>& m) const {
if (this->column() != m.row()) throw std::invalid_argument("維度不匹配");
Matrix<T> result(this->row(), m.column());
// ... 計算邏輯
return result; // C++17 保證 RVO / C++11 移動語義
}
};
} // namespace mathematic
: mathBasic(args) 而非 : mathBasic(args): mathBasic(mat) virtual ~mathBasic() 必須正確釋放 element 記憶體protected,避免派生類重複封裝row()、column()、operator* 均標記 constmathemathic 拼寫錯誤,統一為 mathematicstd::vector<std::vector<T>> 或 std::unique_ptr<T[]> 替代裸指標管理記憶體std::initializer_list 支援列表初始化operator==、operator!=、swap 完成值語義std::span (C++20) 作為非擁有視圖