我收到的错误如下:
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)
答案 0 :(得分:1)
x = input.begin() - &gt;看起来x是某种迭代器
也许你应该这样做:
output.insert(*x)
而不是
output.insert(x)
答案 1 :(得分: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);
此外,此函数必须是静态的,因为当传递指向它们的指针时,不能简单地将自由(或静态)函数与成员函数混合。