проблема метапрограммирования шаблона - PullRequest
0 голосов
/ 19 декабря 2010
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><br> _Kty=Node *, 1> _Pr=bool (__cdecl *)(Node *,Node *) 1> ] Reason: cannot convert from 'overloaded-function' to 'bool (__cdecl *const )(Node *,Node *)' 1><br> None of the functions with this name in scope match the target type

Как я могу решить проблему и получить такую ​​же функциональность? Как правильно определить

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

Спасибо

Ответы [ 3 ]

3 голосов
/ 19 декабря 2010

Нельзя использовать переменную для нетипичного аргумента.

Вместо шаблонной функции попробуйте функциональный объект, который хранит значение 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)));
2 голосов
/ 19 декабря 2010

Параметры шаблона должны быть известны во время компиляции.В вашем случае вы пытаетесь использовать локальную переменную для создания экземпляра шаблонной функции, которая является неправильной.

Полагаю, лучшее решение - не использовать шаблон, просто создайте класс с оператором (), который будет выполнятьтак же, как FComapare () и сохранить р как член класса.

1 голос
/ 19 декабря 2010

Аргументы шаблона должны быть известны во время компиляции.Вы не можете использовать значения времени выполнения в качестве аргументов шаблона.

Поскольку нет причины, по которой p должен быть параметром шаблона в этом случае, это не проблема.Вы можете просто поместить логику FCompare в operator() класса, который имеет p в качестве переменной-члена, а затем передать экземпляр этого класса в качестве аргумента конструктору set.

...