"Invalid allocator::value_type" in custom allocator



  • Hi,

    folgendes Problem: der "ObjectAllocator" löst in der unordered_map einen static_assert "Invalid allocator::value_type" aus. Allerdings tritt dieser Fehler nur auf Mac im XCode auf, Visual Studio hat unter Windows keine Probleme damit.
    Ohne den CustomAllocator im ObjectContainer kompiliert ebenfalls alles auf Mac fehlerfrei. Probiert haben wir es sowohl mit libc++ als auch libstdc++, jeweils mit C++17.

    template <typename T> struct CustomAllocator
    {
        using value_type = T;
        /* other typedefs and allocator functions */
    };
    
    using WorkerAllocator = CustomAllocator <WorkerClass*>;
    using WorkerContainer = std::unordered_set <WorkerClass*, std::hash <WorkerClass*>, std::equal_to <WorkerClass*>, WorkerAllocator>;
    
    using TaskAllocator   = CustomAllocator <std::pair <const TaskEnum, WorkerContainer>>;
    using TaskContainer   = std::unordered_map <TaskEnum, WorkerContainer, std::hash <TaskEnum>, std::equal_to <TaskEnum>, TaskAllocator>;
    
    using ObjectAllocator = CustomAllocator <std::pair <const void* const, TaskContainer>>;
    using ObjectContainer = std::unordered_map <void*, TaskContainer, std::hash <void*>, std::equal_to <void*>, ObjectAllocator>;
    

    Man stößt bei der Recherche nur rar auf Problemlösungen, aber diese haben mit der Const-Correctness im std::pair zu tun. Leider bringen auch sämtliche dort vorgeschlagenen Kombinationen keinen Erfolg mit sich.
    Auch hatten wir vorsichtshalber schon die Hashfunktion für unseren "TaskEnum" ausgetauscht, was natürlich nichts geändert hat.
    Ein weiterer Versuch war, unseren CustomAllocator von std::allocator erben zu lassen (ja, auch wenn man das nicht tun sollte 😃 ) und erstmal einfach nichts zu überschreiben. Auch das löst wieder static_assert aus.

    Wir haben erfahrungsgemäß mehr Zeit zur Fehlerbehebung auf Mac eingeplant, sitzen jedoch hier schon wieder zu lange dran. Hätte denn noch jemanden einen Tip für uns?

    Vielen Dank!


  • Mod

    using ObjectAllocator = CustomAllocator <std::pair <const void* const, TaskContainer>>;
    

    Ist da nicht ein const zuviel?
    Mit
    Key=void*
    ist
    const Key=void* const
    folglich

    using ObjectAllocator = CustomAllocator <std::pair <void* const, TaskContainer>>;
    

Anmelden zum Antworten