我有一些代码无效,解决方案非常简单:只需更长时间地编写代码即可。即,以下内容:
我知道以下是正确的代码:
int main() {
int a = 1,
b = 2;
return 0;
}
但我很惊讶地看到以下错误:
struct Foo {
int a = 0;
};
int main() {
Foo* f = new Foo;
Foo* x = f,
y = f;
return 0;
}
这会出现以下错误:
error: conversion from ‘Foo*’ to non-scalar type ‘Foo’ requested
y = f;
^
即使您将x
和y
的定义替换为:
Foo* x = f;
Foo* y = f;
那么有人可以解释为什么不允许这样做(或者将我重定向到解释这个问题的不可避免的其他SO问题,这是我错过的错误)?
答案 0 :(得分:4)
Foo* x = f,
y = f;
这相当于:
Foo* x = f;
Foo y = f;
您需要添加另一个*
:
Foo* x = f,
*y = f;
答案 1 :(得分:1)
Foo* x = f,
y = f;
在功能上等同于:
Foo* x = f,
Foo y = f;
如您所见,x
和y
的类型不同。因此,错误。
这是"功能之一" C和C ++。就个人而言,我总是将*
附加到标识符,以便最大限度地减少此类问题:
Foo *x, y;
答案 2 :(得分:1)
这就是为什么编写Foo* x
而不是Foo *x
作为C中首选样式的常见C ++样式错误的错误。
一元*
对其右的事物起作用,而不是左边的事物。您的
Foo* x = f,
y = f;
与
相同Foo *x = f;
Foo y = f;
如果你想坚持使用速记,你必须为你声明的每个变量写一个星号:
Foo *x = f,
*y = f;
const
之类的修饰词则相反;他们修改了左边的东西。
Foo const x, y;
与
相同Foo const x;
Foo const y;
但请注意
Foo *const x,
*y;
其中x
是 const指针到非const Foo 而y
是非常量指针再次对非const Foo。
(现在在C和C ++中,首选的样式是每个分号只写一个变量声明,这真的不那么令人困惑。我偶尔会写int i, j, k;
,但只有这样才那么简单。 )
答案 3 :(得分:0)
您需要为定义的每个变量重复*
:
Foo *x = f,
*y = f;
否则,您将x
声明为Foo*
而将y
声明为Foo
(无法收到Foo*
值)Foo *x = f, y = f;
相当于Foo *x = f; Foo y = f;
而不是Foo *x = f; Foo *y = f;
可以想象......