C++ 为什么不是';结构对象不是类型吗?

C++ 为什么不是';结构对象不是类型吗?,c++,struct,C++,Struct,我肯定我误解了什么 在类内实例化一个struct对象并将其作为值传递给构造函数之后,我得到了一个错误 错误:“测试”不是类型 #include <iostream> using namespace std; struct Test { int x = 11; int y = 22; }; class A { private: int foo = 100; public: A(Test tmp){} }; class B { priva

我肯定我误解了什么

在类内实例化一个struct对象并将其作为值传递给构造函数之后,我得到了一个错误

错误:“测试”不是类型

#include <iostream>
using namespace std;

struct Test
{
    int x = 11;
    int y = 22; 
};

class A
{
private:
    int foo = 100;      
public:
    A(Test tmp){}
};
class B
{
private:
    Test test;
    A a(test);   //error    
public:
    B(){}   
};

int main()
{
    B b;    
    return 0;
}
#包括
使用名称空间std;
结构测试
{
int x=11;
int y=22;
};
甲级
{
私人:
int-foo=100;
公众:
A(测试tmp){}
};
B类
{
私人:
试验;
A(测试);//错误
公众:
B(){}
};
int main()
{
B B;
返回0;
}
在[I]实例化类内的结构对象之后

这不是实例化任何东西。这声明每个(此时,
B
类型的理论对象将有一个名为
test
test
类型的成员变量

(此外,在学习过程中尽早养成将任何成员变量
设置为private
,而不是
public
的习惯。
不仅仅是一个带有函数的
结构,它是一个基本的OOP构建块,不应该将其数据成员公开给
public
——这样做很常见(这是一个设计错误。)

这不是您所说的“将[
test
]作为参数传递给构造函数!”

这是向名为
a
的类
B
声明一个成员函数,该类返回类型为
a
的对象,并接受类型为
test
…的未命名参数,由于没有此类类型,因此只有该名称的成员变量,这是一个错误


由于您的代码示例的总体目的不清楚,很难说什么对您来说是“正确的”。

如果您想将
a
声明为数据成员并对其进行初始化,正确的语法应该是:

class B
{
private:
    Test test;
    A a{test};       // default member initializer    
    A a = test;      // default member initializer    
    A a = A(test);   // default member initializer    
public:
    B() : a(test) {} // member initializer list   
};
请注意,仅支持大括号或等于,但不支持括号初始值设定项。并且仅当成员初始值设定项列表中省略了该成员时才使用它


编译器试图将
a
解释为一个函数,该函数返回
a
并将
test
作为参数。
test
不是一个类型名,编译失败。

C++是世界上最区分大小写的语言。
test
是类型,
test
类型的B类成员测试
。让我们知道,如果编写
A(测试)
解决了您的问题,那么我们就可以简单地输入错误来结束这个问题。@dlatikay“最多”?是否有不关心案例和不关心案例的语言?只是一个愚蠢的笑话。但谁知道呢:)这确实是一个简单的输入错误:要么忘记函数声明中的类型,要么大小写错误,要么对默认成员init使用了错误的括号。我的问题是,为什么您希望它首先起作用!@dlatikay:我能想到的唯一一种不区分大小写的编程语言是Visual Basic。奇怪的是,SQL是case也是不敏感的。但问题是C++的区分大小写在软件工程领域几乎没有什么特别之处。我希望OPs示例不是一个最麻烦的解析(是吗?!),至于编译器,它应该很容易实现这不是一个函数定义。仍然想知道为什么像这样的案例没有“更新”在C++标准中,@ VSOFTCO标准不允许默认成员initializer的括号初始化器,我想知道为什么,但是我认为大多数恼人的解析在这里是不相关的,因为<代码>测试;A {测试};< /C> >在函数内是很好的;它不允许默认成员initializer。谢谢。“如果您想将a声明为数据成员并对其进行初始化”,这是我在“在类内实例化一个结构对象”中不正确的想法,我错过了通常从函数调用a(测试)是不可能的。
        A a(test);   //error    
class B
{
private:
    Test test;
    A a{test};       // default member initializer    
    A a = test;      // default member initializer    
    A a = A(test);   // default member initializer    
public:
    B() : a(test) {} // member initializer list   
};