簡體   English   中英

對於std :: string :: c_str,無法從'const char *'轉換為'char *'

[英]cannot convert from 'const char *' to 'char *' for std::string::c_str

這給出了錯誤:無法從'const char *'轉換為'char *'。

class Mock
{
public:
    ...
    static void func(char **result)
    {
          *result = (resultsI++)->c_str();
    }
static std::vector<std::string> results;
static std::vector<std::string>::iterator resultsI;
};

std::vector<std::string> Mock::results;
std::vector<std::string>::iterator Mock::resultsI;

如何在不更改函數func的接口的情況下有效地消除此錯誤? 該接口的實現者:

void (func*)(char **result) 

忘了在簽名中使用const char **。 我無法改變它。

記住這是一個模擬,我只在我的單元測試中使用。

嘗試:

*result = &(*resultsI++)[0];

雖然這不能保證在C ++ 11之前工作,但是在大多數或所有當前編譯器上都可以正常工作。

危險的是,如果函數試圖改變字符串的長度,你可能會得到一些討厭的錯誤。 更改個別字符應該沒問題。

在測試代​​碼中,如果您確定接口的用戶不會改變char *,那么您可以使用const_cast嗎?

假設調用者不接受char *所有權; 如果是這種情況,那么你應該復制一份。

如果您完全確定接口函數不會修改字符串,則可以使用

*result = const_cast<char *>((resultsI++)->c_str());

刪除const

否則,另一個選擇是從使用std::vector<std::string>切換到std::vector<std::vector<char>>但是你必須確保正確地null終止字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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