2012-12-17 48 views
3

我有问题要问。xutility.h错误C2064:术语不会评估为需要2个参数的函数

我已经创建了一个名为AstarPlanlama级别且这两个函数:

bool AstarPlanlama::nodeComp(const Node* lhs, const Node* rhs) 
{ 
    return lhs->F < rhs->F; 
} 

void AstarPlanlama::enKucukFliNodeBul(std::list<Node*> * OPEN) 
{ 
    std::list<Node*>::iterator it = std::min_element(OPEN->begin(), OPEN->end(), &AstarPlanlama::nodeComp); 

    OPEN->sort(&AstarPlanlama::nodeComp); 

    Q = OPEN->front();  

    OPEN->pop_front();  
} 

当我编译我的代码在xutility.h文件时发生错误。

template<class _Pr, class _Ty1, class _Ty2> inline 
    bool _Debug_lt_pred(_Pr _Pred, 
     _Ty1& _Left, _Ty2& _Right, 
     _Dbfile_t _File, _Dbline_t _Line) 
    { // test if _Pred(_Left, _Right) and _Pred is strict weak ordering 
    if (!_Pred(_Left, _Right)) 
     return (false); 
    else if (_Pred(_Right, _Left)) 
     _DEBUG_ERROR2("invalid operator<", _File, _Line); 
    return (true); 
    } 

的功能Declerations:

bool nodeComp(const Node* lhs, const Node* rhs); 

    void enKucukFliNodeBul(std::list<Node*> * OPEN); 

错误行是如果

什么是错的代码(_Pred(_Left,_right)!)?

感谢您对您的回报..

我的问候..

+0

你可以显示两个函数的声明吗?此外,所有大写的名称都是预处理器惯用的名称。我强烈建议不要调用任何OPEN,因为名称可能与预处理器宏冲突,导致各种有趣的调试。 –

+0

查看“输出”窗口。错误的完整上下文将会在那里,包括哪些模板实例化在哪些文件中导致错误。 – Cameron

+0

成员函数有一个额外的参数 - “this”。实际上,你的成员函数的计算结果是一个采用** 3 **参数的函数,当然,除非它是静态的。 – chris

回答

3

它看起来像你逝去的一个成员函数作为您的自定义比较。 让它static或使用std::bind

std::list<Node*>::iterator it = std::min_element(OPEN->begin(), OPEN->end(), 
             std::bind(&AstarPlanlama::nodeComp, 
               this, 
               std::placeholders::_1, 
               std::placeholders::_2)); 

OPEN->sort(std::bind(&AstarPlanlama::nodeComp, 
        this, 
        std::placeholders::_1, 
        std::placeholders::_2)); 

成员函数都是特殊的,需要一个对象上调用,这就是为什么std::bind需要绑定到this指针。

+0

我现在离开我的电脑。我会拍摄它,并让你知道它是否有效。 –

+0

我认为'std :: mem_fn'也适用,但我一直忘记如何使用它。另外,我认为这两个占位符是不必要的。从我记得,只是做'自动绑定= std :: bind(foo,bar);绑定(1,2);'将调用'foo(bar,1,2);'。 – chris

+0

@chris:'std :: mem_fn'需要调用3个参数,第一个参数是一个类对象实例,所以不能在这里使用。 'std :: placeholders'用于未绑定的参数,它们需要在示例中使用。尝试一下代码,看看会发生什么。 –

2

你的nodeComp()声明是错误的 - 如果你想跟着它需要一个自由函数或静态函数,而不是一个普通的成员函数标准库约定。通常情况下,我会建议将其作为免费功能标记为朋友,以便可以访问私人班级成员。你所声明的函数并没有使xutility.h中所期望的比较函数成为可能,因为它携带了“hidden this”参数,它由所有非静态成员函数传递。

另外,考虑到nodeComp()的实现,没有任何理由使它成为常规成员函数,因为它不会对其对象的数据进行操作,而是对作为参数传入的对象的数据进行操作。

为了简化你的生活和任何其他人必须维护代码后的生活,我会遵循标准库约定,并用下面的代码替换nodeComp(),并在该类中声明运算符为朋友AstarPlanlama的声明。

bool operator<(const AstarPlanlama::Node* lhs, const AstarPlanlama::Node* rhs) 
{ 
    return lhs->F < rhs->F; 
} 

此外,它通常是一个坏主意,把原始指针到标准库中的容器为可导致各种有趣的生命周期管理问题。如果你绝对必须使用指针,我会建议使用像boost指针容器一样的容器,或者将对象包装在std::shared_ptr中,而不是处理原始指针。

+0

我现在远离我的电脑了,我会给它拍摄并让你知道它是否有效。 –

相关问题