模板元编程问题

时间:2010-12-19 19:49:36

标签: c++ templates metaprogramming

template <int p>    
bool FComapare (Node *lId, Node* rId)    
{    
    if(lId->getDiff(p) < rId->getDiff(p))
        return true;
    else if(lId->getDiff(p) == rId->getDiff(p))
    {
        if(lId->getLT() < rId->getLT())
            return true;
        else if(lId->getLT() == rId->getLT())
            return (lId->getTFG() < rId->getTFG());
    } 
    return false;
}

vector<set<Node*, bool (*)(Node*,Node*) > > m_F;

for (int i = 0;i < partNum; ++i)
{
    //This doesn`t workbecause of  const problem...
    set<Node *, bool (*)(Node*,Node*) > f(&FComapare<i>);
    m_F.push_back(f);
}

我收到以下错误

  

error C2664: 'std::set<_Kty,_Pr>::set(bool (__cdecl *const &)(Node *,Node *))' : cannot convert parameter 1 from 'bool (__cdecl *)(Node *,Node *)' to 'bool (__cdecl *const &)(Node *,Node *)' 1> with 1> [ 1>
_Kty=Node *, 1> _Pr=bool (__cdecl *)(Node *,Node *) 1> ] Reason: cannot convert from 'overloaded-function' to 'bool (__cdecl *const )(Node *,Node *)' 1>
None of the functions with this name in scope match the target type

如何解决问题并获得相同的功能? 我该如何正确定义

vector<set<Node*, bool (*)(Node*,Node*) > > m_F;

由于

3 个答案:

答案 0 :(得分:3)

您不能将变量用于非类型参数。

尝试一个存储i

值的函数对象,而不是模板函数
class FCompare
{
    int p;
public:
    FCompare(int p): p(p) {}
    bool operator()(const Node *lId, const Node* rId) const {...}
};

set<Node *, FCompare > f((FCompare(i)));

答案 1 :(得分:2)

模板参数应在编译时知道。 在您的情况下,您尝试使用局部变量来实例化错误的模板函数。

我认为最好的解决方案是不使用模板,只需创建一个带有operator()的类,它将与FComapare()一样,并将p存储为类成员。

答案 2 :(得分:1)

模板参数需要在编译时知道。您不能将运行时值用作模板参数。

由于在这种情况下没有理由p需要成为模板参数,所以这不是问题。您可以将FCompare的逻辑放入类的operator()中,其中p作为成员变量,然后将该类的实例作为参数传递给{{1}的构造函数。