首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 簡易 Vector 實現:構造函數模板參數類型不匹配錯誤修復

     編輯:程式設計綜合問答

錯誤代碼分析

template <class T>
class Vector {
public:
    Vector(int sz, T t(int s)); // 第二參數聲明為函數指針類型
    // ...
};

int main() {
    Vector<Vector> v(10, Vector(5)); // 傳遞 Vector 對象,非函數指針
    return 0;
}

編譯錯誤原因

構造函數聲明 Vector(int sz, T t(int s)) 中,第二個參數被解析為函數指針(返回 T、接受 int 的函數),而非類型 T 的值。調用時傳遞 Vector(5)(臨時對象)類型不匹配。

修正方案

方案一:值語義構造函數(標準 vector 風格)

template <class T>
class Vector {
private:
    int size;
    T* data;
public:
    // 默認構造
    Vector(int sz = 0) : size(sz), data(sz ? new T[sz]() : nullptr) {}
    
    // 填充構造:大小 + 初始值
    Vector(int sz, const T& value) : size(sz), data(new T[sz]) {
        for (int i = 0; i < sz; ++i) data[i] = value;
    }
    
    // 拷貝構造
    Vector(const Vector& other) : size(other.size), data(new T[other.size]) {
        std::copy(other.data, other.data + other.size, data);
    }
    
    // 移動構造 (C++11)
    Vector(Vector&& other) noexcept : size(other.size), data(other.data) {
        other.size = 0; other.data = nullptr;
    }
    
    ~Vector() { delete[] data; }
    
    T& operator[](int i) { return data[i]; }
    const T& operator[](int i) const { return data[i]; }
    int getSize() const { return size; }
};

方案二:支持初始化列表 (C++11)

Vector(std::initializer_list<T> list) : size(list.size()), data(new T[list.size()]) {
    std::copy(list.begin(), list.end(), data);
}

// 使用
Vector<int> v = {1, 2, 3, 4, 5};

正確使用示例

int main() {
    Vector<int> v1(10);           // 10 個默認值 0
    Vector<int> v2(10, 5);        // 10 個 5
    Vector<Vector<int>> v3(10, Vector<int>(5)); // 10 個長度為5的Vector
    Vector<int> v4 = {1,2,3};     // C++11 列表初始化
    return 0;
}

關鍵知識點

  • T t(int s) 是函數指針聲明,非類型參數
  • 構造函數參數應為 const T& 或 T&&(移動語義)
  • 遵循 Rule of Three/Five:析構、拷貝構造、拷貝賦值、移動構造、移動賦值
  • 標準庫 std::vector 已高度優化,生產代碼請直接使用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved