[英]Can't pass 'const pointer const' to const ref
假設你有一組指針(是的......):
std::set<SomeType*> myTypeContainer;
然后假設您要從SomeType的const方法搜索此集合:
bool SomeType::IsContainered() const
{
return myTypeContainer.find(this) != myTypeContainer.end();
}
這不起作用。 方法中的this
ptr是一個const SomeType *const
,我無法將其放入find
。 問題是find
需要一個const-ref,在這種情況下,這意味着傳遞的指針被視為const,但不是它指向的東西。
有沒有辦法順利解決這個問題(不改變設置的模板類型)?
為了在有序容器中啟用“混合”比較,可以使用聲明typename key_compare::is_transparent
的key_compare
類型。
set的默認比較functor類是std::less<Key>
。 它不是“透明的”。 但是std::less<void>
是“透明的”並且只要a<b
形成良好,就執行任何參數a
和b
的比較。 因此,您可以定義自己的比較函數類型,或者可以使用std::less<void>
(或等效的std::less<>
):
set<SomeType*,std::less<>> myTypeContainer;
正如你所說,在const成員函數中, this
變成了const SomeType *
(即指向const的指針),它不能被隱式轉換為SomeType *
(即指向非const的指針),這是find
的預期參數類型。
您可以使用const_cast
執行顯式轉換。
bool SomeType::IsContainered() const
{
return myTypeContainer.find(const_cast<SomeType *>(this)) != myTypeContainer.end();
}
如果鑄造結果不用於修改,那將是安全的; 而std::set::find
不會這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.