1

次のようなエラーが表示されます。

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)
4

2 に答える 2

1

x = input.begin() -> x はある種のイテレータのようです

多分あなたはするべきです:

output.insert(*x)

それ以外の

output.insert(x)
于 2013-03-29T14:31:03.130 に答える
1

?StmtNumの派生クラスが原因で、間違った署名で関数を使用しようとしているようです。AttrValue説明する例を次に示します。

#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);

また、メンバー関数へのポインターを渡すときに、フリー (または静的) 関数とメンバー関数を単純に混在させることはできないため、この関数は静的でなければなりません。

于 2013-03-29T15:04:37.817 に答える