2012-02-18 1 views
0

Я пытаюсь создать зЬй :: установить с функцией I, определенной для сортировки, , но я получаю сообщение об ошибке: «Ошибка: функция„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; 

    }; 
}; 

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

+0

@Als Я пробовал полностью его отфильтровать, но не удался. – xcrypt

ответ

3

Второй аргумент шаблона для 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; 
+0

Ссылка говорит мне, что я могу передать функцию? И если я перейду к определению std :: set, я не могу найти явное «typename», поэтому я не понимаю, что вызывает проблемы? – xcrypt

+1

@xcrypt: существует разница между аргументом * template * и аргументом * function/constructor *. См. Мой ответ. – Nawaz

+0

Знаете ли вы, что std :: foreach()? Вы можете передать функцию или функтор там, насколько я знаю, параметр шаблона не может наложить ограничение на это, только параметр функции может. Вы знаете, почему это не работает? EDIT: Я должен задать свой вопрос по-другому: знаете ли вы, почему * вы не можете передать значение? – xcrypt

3

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

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

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