为什么我不能将此比较函数作为模板参数传递?

时间:2012-02-18 13:54:06

标签: c++ stl std

我正在尝试使用我为排序定义的函数创建一个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 个答案:

答案 0 :(得分:3)

std::set的第二个模板参数必须是类型,而不是

如果你想使用函数( value ,而不是 type ),那么你必须将它作为参数传递给构造函数,这意味着你可以做这样:

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;

答案 1 :(得分:3)

如果你真的不想使用仿函数,可以使用指向函数的指针:

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

(在这个例子中,我正在构建一个名为set的对象,这不是一个类数据成员。)