我有一个变量uint16_t a=35;
和一个函数
UINT Read(unsigned int& nVal);
如何以a
的身份将Read()
传递给unsigned int&
?
如果我这样通过
Read(a);
我收到以下错误:
无法将参数1从'uint16_t'转换为'unsigned int&
答案 0 :(得分:6)
您将需要将值复制到(命名的)临时变量中,调用该函数,然后再复制临时副本(可能在检查溢出后)。
uint16_t a = 35;
...
unsigned int temp = a;
const unsigned int result = Read(temp);
// check for overflow here
a = temp;
当然,如果您可以将a
的定义更改为unsigned int
,那将更加简单(但是我认为由于其他原因这是不可能的)。
答案 1 :(得分:3)
由于Read
引用了非常量unsigned int
,因此您不能将其临时传递。您必须在某处创建实际的unsigned int
才能绑定到该引用:
unsigned int au16 = a;
Read(au16);
a = au16; // don't forget to impact on a the changes made on au16
答案 2 :(得分:3)
其他答案都给出了解决方案,但我想我会更深入地研究为什么,您首先会看到错误。
发生了什么事,对于您的编译器来说uint16_t
和unsigned int
是不同的类型(它很可能实现32位的unsigned int
)和{{1 }}可转换为uint16_t
,因此函数调用中隐藏了一个隐式强制转换。
此强制转换生成临时,即一个无名实体,然后将其作为参数传递给函数。
由于该函数采用 non-const 引用,因此该函数可能会修改引用的变量。由于引用的变量是 not unsigned int
,而不是临时变量,因此发生的任何更改都将(无形地)丢失。
为防止这种情况,C ++禁止您将临时变量(或更正确地说是 a
,其中rvalue
只是一种类型)作为非const引用传递
请注意,对于temporary
引用,不存在意外丢失修改的问题,因为您无法修改引用的值。因此,C ++禁止您在其中传递const
。
答案 3 :(得分:-1)
最简单的答案是你不会。
创建类型为unsigned int
的变量,将值复制到该变量,然后将该变量传递给函数。如果需要,在调用函数后,将值复制回去。
uint16_t a = 16;
unsigned temp_a = a;
Read(temp_a);
// check value of temp_a if needed
a = temp_a;
如果编译器提供的a
和uint16_t
实际上是同一类型,则尝试直接传递unsigned
可能可行。但是,这不是标准所保证的,因此并非所有编译器都可以保证。 uint16_t
和unsigned
是不同类型的地方,直接传递a
(如果可以强制编译器接受)将产生不确定的行为。