我正在尝试实现一个简单的分配器来使用向量,但我不明白为什么它不起作用,我找不到如何做得更好的信息,请告诉我!
输出显示“未声明的标识符”和“未找到标识符”,我不明白出了什么问题。
我问了Chatgpt,他也说了同样的话,但帮不了我。
代码
#include <vector>
#include <memory>
#include <iostream>
template<typename T>
struct Allocator
{
using value_type = T;
private:
size_t size_;
public:
explicit Allocator(size_t size) : size_(size) {};
~Allocator() = default;
void* allocate()
{
try
{
void* ptr = malloc(size_ * sizeof(value_type));
std::cout << "allocate " << std::endl;
return ptr;
}
catch (const exception& e)
{
std::cout << e.what << std::endl;
return nullptr;
}
}
void deallocate(void* ptr)
{
try
{
std::cout << "deallocate" << std::endl;
free(ptr);
}
catch (const exception& e)
{
std::cout << e.what << std::endl;
}
}
void construct(void* ptr, const value_type& value)
{
try
{
std::cout << "construct" << std::endl;
new(ptr) value_type(value);
}
catch (const exception& e)
{
std::cout << e.what << std::endl;
}
}
void destroy(void* ptr)
{
try
{
std::cout << "destroy" << std::endl;
ptr -> ~value_type();
}
catch (const exception& e)
{
std::cout << e.what << std::endl;
}
}
void* reallocate(void* ptr, size_t new_size)
{
try
{
std::cout << "reallocate" << std::endl;
void* new_ptr = realloc(ptr, new_size * sizeof(value_type));
if (new_ptr == nullptr)
{
std::cerr << "Error reallocate" << std::endl;
}
return new_ptr;
}
catch (const exception& e)
{
std::cout << e.what << std::endl;
return nullptr;
}
}
};
int main(int argc, char* argv[])
{
std::vector<int, Allocator<int>> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
}
输出
>------ Сборка запущено: проект: CMakeLists, конфигурация: Debug ------
[1/2] Building CXX object CMakeFiles\test2.dir\test2.cpp.obj
FAILED: CMakeFiles/test2.dir/test2.cpp.obj
C:\PROGRA~1\MICROS~4\2022\COMMUN~1\VC\Tools\MSVC\1438~1.331\bin\Hostx64\x64\cl.exe /nologo /TP /DWIN32 /D_WINDOWS /W3 /GR /EHsc /MDd /Ob0 /Od /RTC1 -std:c++20 -ZI /showIncludes /FoCMakeFiles\test2.dir\test2.cpp.obj /FdCMakeFiles\test2.dir\ /FS -c D:\C++\test2\test2.cpp
D:\C++\test2\test2.cpp(31): error C3861: exception: идентификатор не найден
D:\C++\test2\test2.cpp(31): note: контекст создания экземпляра шаблона (сначала самый старый)
D:\C++\test2\test2.cpp(98): note: выполняется компиляция ссылки на экземпляр класс шаблон функции "Allocator<T>"
D:\C++\test2\test2.cpp(31): error C2065: exception: необъявленный идентификатор
D:\C++\test2\test2.cpp(47): error C3861: exception: идентификатор не найден
D:\C++\test2\test2.cpp(47): error C2065: exception: необъявленный идентификатор
D:\C++\test2\test2.cpp(61): error C3861: exception: идентификатор не найден
D:\C++\test2\test2.cpp(61): error C2065: exception: необъявленный идентификатор
D:\C++\test2\test2.cpp(74): error C3861: exception: идентификатор не найден
D:\C++\test2\test2.cpp(74): error C2065: exception: необъявленный идентификатор
D:\C++\test2\test2.cpp(92): error C3861: exception: идентификатор не найден
D:\C++\test2\test2.cpp(92): error C2065: exception: необъявленный идентификатор
ninja: build stopped: subcommand failed.
编译器错误抱怨
exception
未知。您需要添加:
#include <exception>
然后将
exception
更改为 std::exception
。
修复该问题后,您还需要进行一些其他更改:
e.what
必须是 e.what()
ptr -> ~value_type();
必须是 static_cast<value_type*>(ptr) -> ~value_type();
您无法通过构造函数获取数组大小,因为这不是
std::vector
将大小传递给其分配器的地方。您需要将数组大小作为 allocate()
方法的参数。
您的
Allocator
类需要符合 Allocator 要求。目前还没有。