繁体   English   中英

C++ 从 'std::__tuple... {aka 'unsigned int*'} 转换为 'uint32_t' {aka 'unsigned int'} 失去精度

[英]C++ Cast from ‘std::__tuple… {aka ‘unsigned int*’} to ‘uint32_t’ {aka ‘unsigned int’} loses precision

您可能不得不原谅我,因为我是 C++ 的新手,并且可能在我目前编写的代码中犯了一些基本错误。

static tuple<read_result, uint8_t*> m_scan_record(bool skip, uint32_t& size, FILE* file)
{
    read_result result;
    
    tuple<read_result, uint32_t*> rd_rec_size_result = m_read_generic_t<uint32_t>(file);

    result = (read_result)get<0>(rd_rec_size_result);
    
    if (result != read_success )
    {
        return tuple<read_result, uint8_t*>(result, nullptr);
    }

    size = (uint32_t) get<1>(rd_rec_size_result);

    if ( skip )
    {
        fseek(file, size, SEEK_CUR);
    }
// ...
}

template<typename T>
static tuple<read_result, T*> m_read_generic_t(FILE* file)
{
    T ret = 0;
    
    read_result result = m_read_from_file_to_buffer(&ret, sizeof(T), file);

    if (result == read_success)
    {
        return tuple<read_result, T*>(result, &ret);
    }

    return tuple<read_result, T*>(result, nullptr);
}

当我编译这段代码时,我收到了这个错误:

cast from ‘std::__tuple_element_t<1, std::tuple<read_result, unsigned int*> >’ {aka ‘unsigned int*’} to ‘uint32_t’ {aka ‘unsigned int’} loses precision [-fpermissive]

我的意图和我应该做/发生的事情:

  1. m_scan_record的声明中,使用&声明size参数,旨在允许我通过引用传递值,类似于使用REF c# 关键字

  2. 我调用了通用(模板)function m_read_generic_t ,它使用指定的类型<unit32_t>调用,因此(根据其定义)将返回一种类型tuple<read_result, uint32_t*>

  3. 一旦我得到m_read_generic_t返回的元组,我想获取元组的第二个值指向的unit32_t值,并将该值放入上面第 1 点提到的size变量中,然后调用可能可以访问该变量function 再往上一步。

  4. 从以上几点你可以希望看到我的意图(我很感激我在现实中可能很遥远:)是在这一行:

    大小 = (uint32_t) 获取<1>(rd_rec_size_result);

我所做的只是获取一个“指向”值并将其放入匹配类型的变量中,就像经常引用的教科书示例一样:

uint32_t v = 123;
uint32_t* ptr_to_v = &v;
uint32_t x = ptr_to_v;   // x == 123

显然,这不是我的代码真正发生的事情,因为如果是这样,我认为演员将是不需要的。 但如果我删除它,像这样:

size = get<1>(rd_rec_size_result);

然后我得到一个编译时错误:

a value of type "std::__tuple_element_t<1UL, std::tuple<read_result, uint32_t *>>" cannot be assigned to an entity of type "uint32_t"

因此,我相信我做错了什么——但我不知道是什么。 这与我将指针从元组中取出的方式有关吗? 或者在从 uint32_t* 获取 uint32_t 值时还有其他事情发生吗?

这一切都在 Ubuntu 20.04 上的 C++ 环境中,FWIW

非常感谢您的任何/所有建议; 请 go 对我放心!

tuple<read_result, uint32_t*> rd_rec_size_result = ...

这个元组的第二个成员,正如这里明确声明的,是一个指向uint32_t的指针。 这就是uint32_t *的含义,在 C++ 中。

size = (uint32_t) get<1>(rd_rec_size_result);

这将检索uint32_t *并尝试将其转换为uint32_t C++ 不能这样工作。 尽管可以强制进行这种转换,但您的编译器完全有权利相信无论这段代码试图做什么,它一定是错误的。

也许我最初想知道,您的意图是取消引用指针。 无论如何,这就是您的编译错误的原因。 如果您的意图是真正取消引用此指针,那么将其更改为

size = *get<1>(rd_rec_size_result);

然而,这不会是你麻烦的结束。 即使修复了这个编译错误,这样,显示的代码仍然会被严重破坏。

这是因为m_read_generic_t返回一个指向本地 object 的指针,当 function 返回时,该指针将被破坏,并且在这里尝试取消引用该指针会使恶魔飞出你的鼻子

真正的解决方法是首先将m_read_generic_t更改为返回指针作为元组中的第二个值,从而首先消除编译错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM