FAQ

卡住时先看这里

下面这些都不需要打开仓库。工程文件在「起步」页和压缩包里已经给全了。

编译报 redefinition / 重复定义

你把章节里的示意代码贴进了 class Vector 体内。作业纸上半只放声明, 下半才是函数定义。用编辑器撤销 class 里多出来的函数体,改去替换带 TODO(step …) 的那一段。

报 default arguments are not allowed

类外定义不要写 = Allocator()。默认实参只出现在 class 里的声明上。网站「可粘贴代码」已经按类外形式写好,整段替换即可。

报 requires clause differs from declaration

声明和定义的 requires 必须一致。起步页上的作业纸已经写好约束, 不要删。拷贝构造、拷贝赋值、push_back(const T&)、resize(n, value) 都需要 std::copy_constructible<T>。

报 template / 成员函数模板对不上

emplace_back、uninitialized_copy_n、grow_buffer_and_append 有两层 template。 少贴一层就会编译失败。对照网站代码,从第一个 template <typename T, typename Allocator> 复制到函数结尾。

测试仍抛 logic_error 或 out_of_range("TODO")

对应函数还没替换。在作业纸里搜索 TODO(,回到那一章把整段贴上。

CMake 下载 GoogleTest 失败

测试依赖公开的 GoogleTest v1.15.2 源码包(GitHub),不是本教程的仓库。 需要能访问 https://github.com/google/googletest/archive/refs/tags/v1.15.2.tar.gz。 若必须离线:先下载这个 tar.gz 放到工程根目录,把 CMakeLists.txt 里 FetchContent 的 URL 改成本地文件,例如 URL $${CMAKE_CURRENT_SOURCE_DIR}/v1.15.2.tar.gz。

undefined reference to std::… / 找不到 libstdc++

部分环境里 /usr/bin/c++ 是 Clang 却链到 GNU 标准库。配置时指定:

cmake -B build -DCMAKE_CXX_COMPILER=g++ -DMINI_VECTOR_USE_STUDENT=ON

ASan 一跑就报堆错误

多半是 deallocate 的 n 和 allocate 时不一致,或对未初始化内存当 T 来读。对照 Step 02 / 03。暂时关掉 sanitizer 也能编过,但不要当作做完:

cmake -B build -DMINI_VECTOR_SANITIZE=OFF -DCMAKE_CXX_COMPILER=g++

我想先看全绿再拆

把参考答案存成 include/mini_vector/vector.hpp(起步页最后一张卡片,或压缩包里已有), 配置时不要打开 MINI_VECTOR_USE_STUDENT。