无法将 std::字符串::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;
如何在不更改函数函数接口的情况下有效地摆脱此错误?此接口的实现者:
void (func*)(char **result)
忘记在签名中使用常量字符**。我无法改变它。
请记住,这是一个模拟,我只在我的单元测试中使用。
尝试:
*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 终止字符串。
相关文章:
- 在字符串函数中抛出'char const*'实例后调用的终止
- 双重标准?为什么只有 char* const&a = "bla" 的警告?
- 包括"lvtocon.h",未定义对'operator<<(std::ostream&, char const*)的引用
- 为什么 const char* const & = 可以编译"hello"?
- 将字符串文本常量定义为 char const* 和 wchar const*
- 如何将std::wstring转换为char const[]
- "char const * name() const _WEBSOCKETPP_NOEXCEPT_TOKEN_ {"剂量是什么意思
- 使用提升对字符串进行标记化时,将令牌转换为 char* const* 时失败
- 如何从 std::initializer_list<char const* 构建 std::vector<std::string>>
- 将 std::vector<std::string> 转换为 const char* const*
- 引发"char const*"错误的实例后调用的终止
- 将const char * const参数成员分配给新值
- 从'const char**'到'char* const*'的转换无效
- 从 sub_match<常量字符 *>' 转换为'const char *const &'
- char*const和constchar*之间有什么区别?(重复-需要更多澄清)
- 使用工厂方法时编译器错误:无法转换"const std::p air<char* const
- HEVC 解码器端口 Android 警告:从 'signed char*' 到 'char const* 的转换无效*
- 如何从'char const*'中删除常量
- 'char const *str'作为模板参数
- 为什么不;t strlen(.)应为const char*const str,而不是const char*