在下面的代码片段1中,mKnownSRList定义如下:
std::vector<EndPointAddr*> mKnownSRList;
我收到代码片段中显示的编译错误2.您能告诉我这段代码有什么问题吗? getTipcAddress()和compareTo函数的内容显示在下面的代码片段3和4中。
CODE SNIPPET 1(已标记编译错误)
void
ServiceRegistrarAPI::removeKnownSR(EndPointAddr & srEndPointAddr)
{
auto last =
std::remove_if(mKnownSRList.begin(),
mKnownSRList.end(),
[srEndPointAddr]( EndPointAddr* o )
{
//LINE 355 is the following
EndPointTipcAddr myTipcAddress = srEndPointAddr.getTipcAddress();
EndPointTipcAddr otherTipcAddress = o->getTipcAddress();
return (myTipcAddress.compareTo(otherTipcAddress));
});
if(*last != nullptr)
{
delete *last;
}
mKnownSRList.erase(last, mKnownSRList.end());
}
SNIPPET 2(编译错误)
ServiceRegistrarAPI.cpp:355:72: error: passing ‘const EndPointAddr’ as ‘this’ argument of ‘EndPointTipcAddr& EndPointAddr::getTipcAddress()’ discards qualifiers [- fpermissive]
CODE SNIPPET 3(getTipcAddress函数)
EndPointTipcAddr & getTipcAddress() { return mTipcAddress; }
CODE NIPPET 4(compareTo功能)
bool
EndPointTipcAddr::compareTo(EndPointTipcAddr &rhs)
{
if( (mType == rhs.getType()) && (mInstanceNo == rhs.getInstanceNo()) )
{
return true;
}
return false;
}
答案 0 :(得分:5)
见S5.1.2.5:
lambda表达式的闭包类型具有公共内联函数 调用操作符(13.5.4),其中描述了参数和返回类型 由lambda-expression的parameter-declaration-clause和 尾随型分别。这个函数调用运算符是 声明const(9.3.1)当且仅当lambdaexpression的时候 参数声明子句后面没有可变的。它既不是 虚拟也未声明易变。默认参数(8.3.6)不得 在lambdadeclarator的parameter-declaration-clause中指定。 在lambda表达式上指定的任何异常规范都适用 到相应的函数调用操作符。一个 lambda声明符中的attribute-specifier-seq属于该类型 相应的函数调用操作符。 [注意:引用的名称 在lambda-declarator中查找上下文中的 lambda-expression出现。 - 后注]
基本上,暗示是默认情况下生成的仿函数的operator()为const
,并且您已按值捕获,并且此捕获的变量是生成的仿函数的成员。
所以,你有两个选择:
将lambda更改为以下内容(请注意参数声明子句后面的mutable
):
[srEndPointAddr](EndPointAddr* o) mutable { ... }
答案 1 :(得分:3)
不允许谓词函数(std::remove_if
的第三个参数)修改对象。在迭代器上调用的所有方法都必须是const
。见this documentation:
该函数不得修改其参数。
如果要返回值的副本或getTipcAddress
指针,则可以将const
设置为const
。
答案 2 :(得分:0)
简而言之,您会收到此错误,因为在这种情况下您在const实例上调用非const方法:srEndPointAddr
是const但您在其上调用非const方法getTipcAddress
。你的解决方案是声明这个方法const,因为它似乎是一个简单的getter,可能不会修改对象。
答案 3 :(得分:0)
这是如何解决问题的答案,而不是为什么会出错(感谢juanchopanza)
我猜你对const限定符有一些问题。
为const
添加getTipcAddress
- 限定重载:
EndPointTipcAddr & getTipcAddress() const { return mTipcAddress; }
~~~~~
并在const
末尾添加compareTo
:
bool EndPointTipcAddr::compareTo(EndPointTipcAddr &rhs) const
~~~~~