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)(臨時對象)類型不匹配。
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; }
};
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&&(移動語義)std::vector 已高度優化,生產代碼請直接使用