繁体   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