Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法从';常量字符*';至';字符*';对于std::string::c_str_C++ - Fatal编程技术网

C++ 无法从';常量字符*';至';字符*';对于std::string::c_str

C++ 无法从';常量字符*';至';字符*';对于std::string::c_str,c++,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>::iterato

这会产生错误:无法从“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;
签名中忘记使用常量字符**。我不能改变它


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

在测试代码中,如果您确定界面的用户不会改变字符*,也许您可以使用
常量转换


假设调用者不拥有
char*
;如果是这种情况,那么您应该制作一份副本。

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

*result = const_cast<char *>((resultsI++)->c_str());
*result=const_cast((resultsI++->c_str());
要删除常量,请执行以下操作

否则,另一个选项是从使用
std::vector
切换到
std::vector
,但您必须确保正确地以null结尾字符串。

尝试:

*result = &(*resultsI++)[0];
虽然这不能保证在C++11之前工作,但众所周知,它在大多数或所有当前编译器上都是正常的


危险在于,如果函数试图更改字符串的长度,可能会出现一些严重错误。更改单个字符应该可以。

我猜你必须复制而不是使用
c_str()
。你可以(但不应该)抛弃常量(const_cast((resultsI++->c_str());)Ryan Guthrie:我为什么不应该这样做?常量是为了保护你自己。如果将其丢弃,您将失去这种保护。因此只有C++11指定
std::string
必须使其内存连续?@Kos:这是正确的。尽管我所熟悉的大多数C++03实现实际上都使用连续存储,但在C++03标准中并不能保证这一点。当我需要C++03保证连续存储时,我通常使用
vector
而不是
string
@Kos,在对所有委员会成员的调查显示他们的
std::string
实现已经符合要求后,保证被添加到C++11中。@JohnDibling,我也使用了
vector
,这取决于任务。有时它很好,有时没有string方法会使它变得单调乏味。这里的危险是,对原始字符串的任何修改都可能导致它移动,并且它们不能保证它以“\0”结尾,如果将它传递给C-string函数,这可能是个问题。如果我做了这么危险的事,我喜欢让大家知道这是危险的。通过使用
const_cast((resultsI++)->c_str())
您可以让它引人注目,因为我们知道不应该使用const cast。这样你就知道你的代码很糟糕,而且它很突出。
*result = &(*resultsI++)[0];