我在使用GCC编译以下程序时遇到问题(我尝试了多个版本,但均因相同的错误而失败)。它在Clang中可以正常编译:
#include <vector>
struct Tag1
{
static void logAllocation(){}
static void logDeallocation(){}
};
struct Tag2
{
static void logAllocation(){}
static void logDeallocation(){}
};
template<typename Tag, typename T>
struct MyAllocator
{
using value_type = typename std::allocator<T>::value_type;
T* allocate(std::size_t n)
{
Tag::logAllocation();
return std::allocator<T>{}.allocate(n);
}
void deallocate(T* p, std::size_t n)
{
Tag::logDeallocation();
std::allocator<T>{}.deallocate(p, n);
}
};
int main()
{
std::vector<int, MyAllocator<Tag1, int>> vec;
}
问题在于,GCC认为在Tag==int
inside内MyAllocator
,我得到一个错误,即'logDeallocation'不是'int'的成员。这是GCC中的错误吗?当我翻转模板参数(template<typename T, typename Tag
)并std::vector<int, MyAllocator<int, Tag1>> vec;
在编译时声明我的向量时。
这不是合格的分配器,将其作为一个库提供给库组件会导致未定义的行为(因此,两个实现都合格)。您缺少!=
,,==
交叉类型的隐式转换,以及与此相关的rebind
。
allocator_traits
的默认rebind
实现假定值类型是第一个模板参数(并且所有其余模板参数都可以未经修改地重复使用)。由于分配器并非如此,因此您需要提供自己的分配器rebind
或反转模板参数的顺序。
vector
这是非常特殊的,因为实现可以根据需要直接使用提供的分配器而无需重新绑定。这就是为什么您的示例代码使用libc ++进行编译的原因。libstdc ++的容器支持允许您执行的扩展vector<int, allocator<char>>
,因此它总是将分配器重新绑定到指定的value_type
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句