Почему я не могу передать эту функцию сравнения в качестве аргумента шаблона? - PullRequest
0 голосов
/ 18 февраля 2012

Я пытаюсь создать std :: set с функцией, которую я определил для сортировки, но я получаю ошибку: «Ошибка: функция« GFX :: MeshCompare »не является именем типа»

Mesh.h

namespace GFX
{
    struct Mesh
    {
        [...]
    };

    inline bool MeshCompare(const Mesh& a, const Mesh& b)
    {   
        return ( (a.pTech < b.pTech) ||
                 ( (b.pTech == a.pTech) && (a.pMaterial < b.pMaterial) ) ||
                 ( (b.pTech == a.pTech) && (a.pMaterial == b.pMaterial) && (a.topology < b.topology) ) 
               );
    }
};

Renderer.h

namespace GFX
{
    class Renderer
    {
    private:
        [...]
        std::set<Mesh, MeshCompare> m_Meshes;

    };
};

Что я делаю не так и как мне это исправить?

Ответы [ 2 ]

3 голосов
/ 18 февраля 2012

Если вы действительно не хотите использовать функтор, вы можете использовать указатель на функцию:

std::set<Mesh, bool(*)(Mesh const&, Mesh const&)> set(MapCompare);

(В этом примере кода я создаю объект с именем set, этоне член класса данных.)

3 голосов
/ 18 февраля 2012

Второй аргумент шаблона для std::set должен иметь тип , а не значение .

Если вы хотите использовать функцию (которая значение , а не тип ), тогда вы должны передать ее в качестве аргумента конструктору, что означает, что вы можете сделать это:

class Renderer
{
    typedef bool (*ComparerType)(Mesh const&,Mesh const&);

    std::set<Mesh, ComparerType> m_Meshes;
public:
     Renderer() : m_Meshes(MeshCompare) 
     {        //^^^^^^^^^^^^^^^^^^^^^^^ note this
     }
};

Или определите класс функтора и передайте его как второй тип аргумент std::set.

struct MeshComparer
{   
    bool operator()(const Mesh& a, const Mesh& b) const
    {
             return ( (a.pTech < b.pTech) ||
             ( (b.pTech == a.pTech) && (a.pMaterial < b.pMaterial) ) ||
             ( (b.pTech == a.pTech) && (a.pMaterial == b.pMaterial) && (a.topology < b.topology) ) );
   }
};

А затем используйте его:

std::set<Mesh, MeshComparer> m_Meshes;
...