【问题标题】:C++ Invalid conversion from char* to char (char* = *string.begin() )C++ 从 char* 到 char 的无效转换 (char* = *string.begin() )
【发布时间】:2016-02-09 18:57:51
【问题描述】:

我有以下代码:

std::string extract() {

    fstream openfile("/home/name/Documents/testfile");
    std::string teststring;
    long location = 4;
    long length = 2;
    teststring.resize(length);
    char* begin = *teststring.begin();
    openfile.seekp(location);
    openfile.read(begin, length);

    return teststring;
}

此代码应该返回在文件中找到的字符串。例如,如果文件的内容是

StackOverflow

这个方法应该返回

kO

此代码是由友好的 StackOverflow 用户提供给我的。我的问题是,我得到一个编译错误,上面写着:“从 char* 到 char 的无效转换”。问题是

char* begin = *teststring.begin();

线。我该如何解决这个问题?

【问题讨论】:

  • LHS 是 char*,而 RHS 是 char。只需从 RHS 中删除 *
  • @Pavel Gatnar 这给出了错误代码 error: cannot convert 'std::basic_string::iterator* {aka __gnu_cxx::__normal_iterator > *}' 到 'char*' 初始化
  • @bartgol 字符串迭代器不是 char*
  • 你是对的。傻我。何塞的回复是我应该写的:取消引用,然后取地址。

标签: c++ char readfile


【解决方案1】:

teststring.begin() 返回一个迭代器,如果您使用 * 运算符取消引用它,您将获得一个对 char (char&) 的引用。

因此,您可以将其地址设为:

char* begin = &*teststring.begin();

或者你可以这样做:

char* begin = &teststring[0];

或者

char* begin = &teststring.front() //(C++11) [@Jonathan Wakely]

向量也是如此。 Altho 在向量 (C++11) 中添加了一个名为 data() 的新函数,该函数返回指向 T 的指针;

所以你可以用矢量来做

char * begin = myvector.data(); // (if T is char)

【讨论】:

  • 另一种方式:&teststring.front()
  • 已更新,实际上不知道那个(似乎是 C+11)。其他两个都习惯了。
  • 谢谢!有用。我正在使用 char* begin = &*teststring.begin();而且效果很好
【解决方案2】:

如果要将迭代器值转换为基础数据,有一个技巧可以获取指向第一个元素的指针。

auto iterator_testdata = testdata.begin();
char* first_element_in_testdata = &(*iterator_testdata);

如果迭代器迭代 char 值。

这个技巧也适用于 vector::begin() 和类似的连续容器。小心使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    相关资源
    最近更新 更多