2012-11-16 157 views
3

這給出了錯誤:無法從'const char *'轉換爲'char *'。不能從'const char *'轉換爲'char *'爲std :: string :: c_str

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 **。我無法改變它。

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

+0

猜你必須複製而不是使用'c_str()'。 – chris

+0

你可以(但不應該)扔掉常量(const_cast ((resultsI ++) - > c_str());) –

+0

Ryan Guthrie:爲什麼我不應該這樣做? – Baz

回答

4

在測試代碼中,如果你是某些該接口的用戶不會改變char *,也許你可以使用const_cast

假設來電者不接受char *;如果是這樣的話,那麼你應該複製一份。

3

如果你是絕對肯定的是,接口功能不會修改字符串,你可以使用

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

刪除const湖。

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

6

嘗試:

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

雖然這不能保證之前,C++ 11它是已知的大多數或所有當前的編譯器確定工作。

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

+0

那麼只有C++ 11指定'std :: string'必須有內存連續? – Kos

+0

@Kos:沒錯。儘管我熟悉的大多數C++ 03實現實際上都使用連續存儲,但在C++ 03標準中並不能保證。當我需要C++ 03保證連續存儲時,我通常使用'vector '而不是'string' –

+0

@Kos,在對所有委員會成員進行的調查顯示他們的'std: :字符串'實現已經符合。 –

相關問題