为什么编译器会抛出 "expected a type specifier"?
Why is compiler throwing "expected a type specifier"?
class A
{
private:
int a;
public:
int get_a()
{
return a;
}
A(int mode)
{
a = 0;
}
A()
{
a = 5;
}
};
class B
{
public:
A b(0);
};
class C
{
int c;
public:
C(int mode)
{
c = 0;
}
C()
{
c = 1;
}
};
int main()
{
B bb;
C cc(0);
//cout << bb.b.get_a();
system("pause");
return 0;
}
如果我在 class B 中的 b 上使用 () 括号,如果我切换到 {},它会给出错误,一切都很好。我的问题是我不应该被允许这样做,因为在 cc in main 上它不会给出任何错误。并且我允许在初始化对象时使用 () 括号。
根据 C++ 20 标准(11.4 Class 成员),您可以使用大括号或等于初始化器来初始化 class
的数据成员
member-declarator:
...
declarator brace-or-equal-initializeropt
所以你可以使用任何一种
class B
{
public:
A b = 0;
};
或
class B
{
public:
A b { 0 };
};
这样可以避免函数声明的歧义。
class A
{
private:
int a;
public:
int get_a()
{
return a;
}
A(int mode)
{
a = 0;
}
A()
{
a = 5;
}
};
class B
{
public:
A b(0);
};
class C
{
int c;
public:
C(int mode)
{
c = 0;
}
C()
{
c = 1;
}
};
int main()
{
B bb;
C cc(0);
//cout << bb.b.get_a();
system("pause");
return 0;
}
如果我在 class B 中的 b 上使用 () 括号,如果我切换到 {},它会给出错误,一切都很好。我的问题是我不应该被允许这样做,因为在 cc in main 上它不会给出任何错误。并且我允许在初始化对象时使用 () 括号。
根据 C++ 20 标准(11.4 Class 成员),您可以使用大括号或等于初始化器来初始化 class
的数据成员member-declarator:
...
declarator brace-or-equal-initializeropt
所以你可以使用任何一种
class B
{
public:
A b = 0;
};
或
class B
{
public:
A b { 0 };
};
这样可以避免函数声明的歧义。