C ++在xmemory和xrefwrap中返回函数,错误C2440,C2100的函数

时间:2013-03-29 14:14:29

标签: c++ visual-c++ function-pointers

我收到的错误如下:

Error   24  error C2440: 'initializing' : cannot convert from 'std::_List_const_iterator<_Mylist>' to 'AttrValue'   c:\program files (x86)\microsoft visual studio 10.0\vc\include\xmemory  208
Error   25  error C2100: illegal indirection    c:\program files (x86)\microsoft visual studio 10.0\vc\include\xrefwrap 49
Error   26  error C2296: '.*' : illegal, left operand has type 'AttrValue'  c:\program files (x86)\microsoft visual studio 10.0\vc\include\xrefwrap 49
Error   37  error C2440: 'initializing' : cannot convert from 'std::_List_const_iterator<_Mylist>' to 'AttrValue'   c:\program files (x86)\microsoft visual studio 10.0\vc\include\xmemory  208
Error   38  error C2100: illegal indirection    c:\program files (x86)\microsoft visual studio 10.0\vc\include\xrefwrap 49
Error   39  error C2296: '.*' : illegal, left operand has type 'AttrValue'  c:\program files (x86)\microsoft visual studio 10.0\vc\include\xrefwrap 49

它没有指向我的代码,所以我不知道什么是错的。但是看看MSDN文档,我认为问题可能是由以下原因造成的:

function<bool(AttrValue)> QueryEvaluatorPrivate::getClausePredicate(Relation clauseType, int preferedIndex) {
    switch (clauseType) {
    case UsesRelation:
        if (preferedIndex == 0)
            return &QueryEvaluatorPrivate::hasVarsUsed;
        return &QueryEvaluatorPrivate::hasStmtsUsing;
    case UsesPRelation:
        if (preferedIndex == 0)
            return &QueryEvaluatorPrivate::hasVarsUsedInProc;
        return &QueryEvaluatorPrivate::hasProcsUsing;
    }
}

hasVarsUsed和其他has*函数只是返回bool的函数。这有什么问题吗?

更新

按照@ Cameron的评论,在输出窗口中 output 。我认为违规行是output.insert(x)(最后一行):

    ... 
    function<bool(AttrValue)> clausePredicate = getClausePredicate(cl.type, prefered);
    unordered_set<AttrValue> output;
    if (prefered == pos) {
        for (auto x = input.begin(); x != input.end(); ++x) 
            if (clausePredicate(*x)) 
                output.insert(x);
    ...

但那有什么不对吗?也许我在看错了地方?

更新2

修正了第一个问题output.insert(x)应该是output.insert(*x) ...但我有

Error   6   error C2100: illegal indirection    c:\program files (x86)\microsoft visual studio 10.0\vc\include\xrefwrap 49

我认为违规行是:

return &QueryEvaluatorPrivate::hasVarsUsed;

我可能错误地返回了函数?

// function declaration
bool QueryEvaluatorPrivate::hasVarsUsed(StmtNum s)

2 个答案:

答案 0 :(得分:1)

x = input.begin() - &gt;看起来x是某种迭代器

也许你应该这样做:

output.insert(*x)

而不是

output.insert(x)

答案 1 :(得分:1)

看起来您正在尝试使用带有错误签名的函数,可能是因为StmtNumAttrValue的派生类?这是一个解释的例子:

#include <functional>

struct A {};
struct B : A {};

void fa( A ) {}
void fb( B ) {}

int main()
{
  std::function<void(A)> f1( &fa ); // OK
  std::function<void(A)> f2( &fb ); // fails
}

在您的代码中,我看到function<bool(AttrValue)>,但功能是

bool QueryEvaluatorPrivate::hasVarsUsed(StmtNum s);

此外,此函数必须是静态的,因为当传递指向它们的指针时,不能简单地将自由(或静态)函数与成员函数混合。