为什么GCC认为template参数是int而它是完全不同的类型?

rubix_addict

我在使用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==intinside内MyAllocator,我得到一个错误,即'logDeallocation'不是'int'的成员这是GCC中的错误吗?当我翻转模板参数(template<typename T, typename Tag)并std::vector<int, MyAllocator<int, Tag1>> vec;在编译时声明我的向量时。

TC

这不是合格的分配器,将其作为一个库提供给库组件会导致未定义的行为(因此,两个实现都合格)。您缺少!=,,==交叉类型的隐式转换,以及与此相关的rebind

allocator_traits的默认rebind实现假定值类型是第一个模板参数(并且所有其余模板参数都可以未经修改地重复使用)。由于分配器并非如此,因此您需要提供自己的分配器rebind或反转模板参数的顺序。


vector这是非常特殊的,因为实现可以根据需要直接使用提供的分配器而无需重新绑定。这就是为什么您的示例代码使用libc ++进行编译的原因。libstdc ++的容器支持允许您执行的扩展vector<int, allocator<char>>,因此它总是将分配器重新绑定到指定的value_type

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

为什么接口类型被认为与重载完全不同?

来自分类Dev

为什么gcc和clang会为成员函数模板参数生成完全不同的代码?

来自分类Dev

为什么JSON解析不会因传递给Decode()的类型完全不同而失败?

来自分类Dev

为什么dotnet运行与VS Code调试完全不同

来自分类Dev

熊猫drop_duplicates()“ keep”参数给出了完全不同的答案-它是如何工作的?

来自分类Dev

为什么算术运算符的参数类型默认为int?

来自分类Dev

为什么 Idris 认为我的类型参数 k 是 Type 类型?

来自分类Dev

当问题本质上完全不同时,为什么要使用C2259?

来自分类Dev

为什么 PIL 和 matplotlib 在这里创建完全不同的图像?

来自分类Dev

为什么最后连接的字符串与代码所做的完全不同?

来自分类Dev

为什么Hibernate的缓存统计信息与EhCache的统计信息完全不同

来自分类Dev

shutil.copy2 给出“SameFileError”尽管文件完全不同 - 为什么?

来自分类Dev

为什么CHECKSUM_AGG()对于完全不同的输入值返回相同的值?

来自分类Dev

为什么属于同一工作的任务的持续时间在Spark Streaming中是完全不同的?

来自分类Dev

为什么在左联接中使用子查询会给出与等效表完全不同的答案?

来自分类Dev

为什么在线测试的正则表达式在C ++中表现完全不同?

来自分类Dev

为什么 max-width 和 width 显示完全不同的结果?

来自分类Dev

从函数返回完全不同的数据类型

来自分类Dev

为什么分类器的 score 函数返回的结果与 sklearn 中的 cross_val_score 函数完全不同?

来自分类Dev

为什么两台笔记本电脑在同一WLAN上显示完全不同的Internet速度?

来自分类Dev

(菜鸟问题)为什么在 .py 和 .html 文件中检查用户是否是博客文章的作者完全不同?

来自分类Dev

为什么“宽度=设备宽度”完全不起作用?

来自分类Dev

为什么这个div对jQuery完全不可见?

来自分类Dev

为什么GCC的global和static int存储方式不同?

来自分类Dev

为什么认为列是参数值

来自分类Java

为什么默认为“ int”而不是“ byte”?

来自分类Dev

我的 C++ 代码有什么问题?对于 a = 90 Z 应该等于 -1,但我得到了完全不同的答案。为什么?

来自分类Dev

为什么按名称调用参数期望使用Int类型的参数,而不是()=> Int类型

来自分类Dev

GCC在类似的体系结构上使用“ -march = native”发出完全不同的代码

Related 相关文章

  1. 1

    为什么接口类型被认为与重载完全不同?

  2. 2

    为什么gcc和clang会为成员函数模板参数生成完全不同的代码?

  3. 3

    为什么JSON解析不会因传递给Decode()的类型完全不同而失败?

  4. 4

    为什么dotnet运行与VS Code调试完全不同

  5. 5

    熊猫drop_duplicates()“ keep”参数给出了完全不同的答案-它是如何工作的?

  6. 6

    为什么算术运算符的参数类型默认为int?

  7. 7

    为什么 Idris 认为我的类型参数 k 是 Type 类型?

  8. 8

    当问题本质上完全不同时,为什么要使用C2259?

  9. 9

    为什么 PIL 和 matplotlib 在这里创建完全不同的图像?

  10. 10

    为什么最后连接的字符串与代码所做的完全不同?

  11. 11

    为什么Hibernate的缓存统计信息与EhCache的统计信息完全不同

  12. 12

    shutil.copy2 给出“SameFileError”尽管文件完全不同 - 为什么?

  13. 13

    为什么CHECKSUM_AGG()对于完全不同的输入值返回相同的值?

  14. 14

    为什么属于同一工作的任务的持续时间在Spark Streaming中是完全不同的?

  15. 15

    为什么在左联接中使用子查询会给出与等效表完全不同的答案?

  16. 16

    为什么在线测试的正则表达式在C ++中表现完全不同?

  17. 17

    为什么 max-width 和 width 显示完全不同的结果?

  18. 18

    从函数返回完全不同的数据类型

  19. 19

    为什么分类器的 score 函数返回的结果与 sklearn 中的 cross_val_score 函数完全不同?

  20. 20

    为什么两台笔记本电脑在同一WLAN上显示完全不同的Internet速度?

  21. 21

    (菜鸟问题)为什么在 .py 和 .html 文件中检查用户是否是博客文章的作者完全不同?

  22. 22

    为什么“宽度=设备宽度”完全不起作用?

  23. 23

    为什么这个div对jQuery完全不可见?

  24. 24

    为什么GCC的global和static int存储方式不同?

  25. 25

    为什么认为列是参数值

  26. 26

    为什么默认为“ int”而不是“ byte”?

  27. 27

    我的 C++ 代码有什么问题?对于 a = 90 Z 应该等于 -1,但我得到了完全不同的答案。为什么?

  28. 28

    为什么按名称调用参数期望使用Int类型的参数,而不是()=> Int类型

  29. 29

    GCC在类似的体系结构上使用“ -march = native”发出完全不同的代码

热门标签

归档