簡體   English   中英

無法將'const pointer const'傳遞給const ref

[英]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_transparentkey_compare類型。

set的默認比較functor類是std::less<Key> 它不是“透明的”。 但是std::less<void>是“透明的”並且只要a<b形成良好,就執行任何參數ab的比較。 因此,您可以定義自己的比較函數類型,或者可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM