对于std :: string :: c_str,无法从'const char *'转换为'char *'

时间:2012-11-16 16:20:19

标签: c++

这给出了错误:无法从'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 **。我无法改变它。

请记住,这是一个模拟,我只在我的单元测试中使用。

3 个答案:

答案 0 :(得分:6)

尝试:

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

虽然在C ++ 11之前无法保证这一点,但在大多数或所有当前编译器上都可以正常工作。

危险在于,如果函数尝试更改字符串的长度,则可能会出现一些令人讨厌的错误。更改单个字符应该没问题。

答案 1 :(得分:4)

在测试代码中,如果你某些接口的用户不会改变char *,那么你可以使用const_cast吗?

假设来电者不取得char *的所有权;如果是这种情况,那么你应该复制一份。

答案 2 :(得分:3)

如果你完全确定接口函数不会修改字符串,你可以使用

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

删除const

否则,另一种选择是从使用std::vector<std::string>切换到std::vector<std::vector<char>>,但是你必须确保正确地终止字符串。