【问题标题】:invalid conversion from cql::cql_byte_t* {aka unsigned char*} to const char*从 cql::cql_byte_t* {aka unsigned char*} 到 const char* 的无效转换
【发布时间】:2013-10-23 18:01:48
【问题描述】:

我正在尝试从 C++ 中的字节数组中提取几个字节。我正在使用 ntohs 提取前两个字节,这是我的 schemaId.. 所以我在 FileMapMgr 类中创建了一个方法,它将是使用ntohs..进行转换。

uint16_t newSchemaId;

for (size_t i = 0; i < result->column_count(); ++i) {
    cql::cql_byte_t* data = NULL;
    cql::cql_int_t size = 0;
    result->get_data(i, &data, size);

        int index=0;

        // this line gives me exception
        newSchemaId = FileMapMgr::get_uint16(&data[index]);
        index += 2;

        flag = false;
}

下面是我从上述方法调用的 FileMapMgr 类中的方法-

uint16_t FileMapMgr::get_uint16(const char* buffer)
{
    if (buffer)
    {
        return ntohs(*reinterpret_cast<const uint16_t*>(buffer));
    }
    return 0;
}

下面是我得到的例外 -

error: invalid conversion from cql::cql_byte_t* {aka unsigned char*} to const char* [-fpermissive]

这里有什么我遗漏的吗?

我在这里为 Cassandra 使用 libcql 库。所以这个cql::cql_byte_t* 来自 libcql Cassandra 库..

对此的任何帮助将不胜感激..

【问题讨论】:

  • '我这里有什么遗漏吗?'是的,很可能是constconst_cast&lt;&gt;
  • 感谢 g-makulik 的建议...我应该在哪里添加这个演员表?我不想修改我的 FileMapMgr 方法代码。有什么方法可以从我的 for 循环中传递信息以使其工作?

标签: c++ pointers casting char bytearray


【解决方案1】:

编译器抱怨它无法将cql::cql_byte_t* 转换为const char*。这显然是因为 cql::cql_byte_t 别名为 unsigned char

您可以在调用方法之前强制转换指针,也可以添加一个新方法来获取const unsigned char *

对于前者:

        // this line gives me exception
        newSchemaId = FileMapMgr::get_uint16(reinterpret_cast<char *>(&data[index]));

对于后者:

uint16_t FileMapMgr::get_uint16(const unsigned char* buffer)
{
    return get_uint16(reinterpret_cast<const char *>(buffer));
}

【讨论】:

  • 非常感谢 jxh 的建议。我可以使用上述任何一个建议,对吗?我正在考虑使用您给我的前一个示例..我不倾向于更改 FileMapMgr 代码..让我试试这个..谢谢。
  • 是的,任何一个。但是第二个不是改变原来的功能,而是增加一个新的功能。不客气。
猜你喜欢
  • 1970-01-01
  • 2019-10-30
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 2013-02-09
  • 2020-07-14
相关资源
最近更新 更多