Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调用不为';时出现类型未找到错误;函数中的t_C++_Oop - Fatal编程技术网

C++ 调用不为';时出现类型未找到错误;函数中的t

C++ 调用不为';时出现类型未找到错误;函数中的t,c++,oop,C++,Oop,我正试图弄明白为什么会出现这个错误,但我没有成功 当我试图编译这段代码时 using namespace std; #include <iostream> #include <gmp.h> #include <gmpxx.h> class MyRand { gmp_randclass randGen(gmp_randinit_default); }; int main() { MyRand s(); gmp_randclass g

我正试图弄明白为什么会出现这个错误,但我没有成功

当我试图编译这段代码时

using namespace std;
#include <iostream>
#include <gmp.h>
#include <gmpxx.h>

class MyRand
{
    gmp_randclass randGen(gmp_randinit_default);
};


int main()
{
    MyRand s();
    gmp_randclass gmpRand(gmp_randinit_default);

    return 0;
}
与此相同(在主函数内)

只有第一个会生成错误

另外,如果我定义类MyRand如下(在函数中初始化mpz_rand类)

我可以毫无差错地编译它

有人知道发生了什么吗


非常感谢。

您不能在定义类成员的地方初始化它们(至少在C++11之前不能)。你可以把它放在构造函数里

class MyRand
{
public:
    MyRand() : randGen(gmp_randinit_default) {
    }
private:
    gmp_randclass randGen;
};

您不能在定义类成员的地方初始化它们(至少在C++11之前不能)。你可以把它放在构造函数里

class MyRand
{
public:
    MyRand() : randGen(gmp_randinit_default) {
    }
private:
    gmp_randclass randGen;
};

使用{}括号初始值设定项或=初始值设定项

class MyRand
{
    gmp_randclass randGen{gmp_randinit_default};
};
然后尝试使用c++11支持进行编译

g++ -std=c++11 Random.cpp  -lgmpxx -lgmp

使用{}括号初始值设定项或=初始值设定项

class MyRand
{
    gmp_randclass randGen{gmp_randinit_default};
};
然后尝试使用c++11支持进行编译

g++ -std=c++11 Random.cpp  -lgmpxx -lgmp

成功了!但是,您的construtor和这个
MyRand(){randGen(gmp\u randinit\u default);}
之间有什么区别?因为这个不行,我做了我的工作,发现它叫做初始化列表。但是我读到的文本说它用于初始化
const
reference
字段。这里不是这样吗,里特?我的意思是,randGen既不是一个
常量
也不是一个
引用
。事实上,当我试图使用我在上面第一条评论中编写的构造函数时,我收到了这个错误:匹配调用gmp\u randclass::gmp\u randclass()的函数。因此,我认为
gmp\u randclass
没有默认构造函数。但我不明白为什么会调用此默认构造函数。您可以初始化
初始化列表
中的任何成员,而不仅仅是
常量
引用
。我不知道你从哪里读到的。
MyRand(){randGen(gmp\u randinit\u default)}
这段代码根本没有任何意义。1.在进入MyRand()的主体之前,应正确初始化randGen。因为您没有在
初始化列表中初始化它。它将使用它没有的默认构造函数构造。这就是你收到错误的原因。2.不能在MyRand构造函数的函数体中初始化randGen。它已经建成了!你可以给它赋值。但它永远不会被建造两次!成功了!但是,您的construtor和这个
MyRand(){randGen(gmp\u randinit\u default);}
之间有什么区别?因为这个不行,我做了我的工作,发现它叫做初始化列表。但是我读到的文本说它用于初始化
const
reference
字段。这里不是这样吗,里特?我的意思是,randGen既不是一个
常量
也不是一个
引用
。事实上,当我试图使用我在上面第一条评论中编写的构造函数时,我收到了这个错误:匹配调用gmp\u randclass::gmp\u randclass()的函数。因此,我认为
gmp\u randclass
没有默认构造函数。但我不明白为什么会调用此默认构造函数。您可以初始化
初始化列表
中的任何成员,而不仅仅是
常量
引用
。我不知道你从哪里读到的。
MyRand(){randGen(gmp\u randinit\u default)}
这段代码根本没有任何意义。1.在进入MyRand()的主体之前,应正确初始化randGen。因为您没有在
初始化列表中初始化它。它将使用它没有的默认构造函数构造。这就是你收到错误的原因。2.不能在MyRand构造函数的函数体中初始化randGen。它已经建成了!你可以给它赋值。但它永远不会被建造两次!顺便说一句,这是:
MyRand s()没有创建局部变量,它声明了一个函数。我不明白。。。它创建一个局部变量s并运行其构造函数no?no,它声明一个名为
s
的函数,该函数不带任何参数并返回一个
MyRand
。谷歌“最烦人的解析”。@SebastianRedl,我搜索了一下。。。但是我可以在另一个函数中声明一个函数吗?因为这一行在
main
中。可以。您不能定义它,但可以声明它。顺便说一句,这个:
MyRand s()没有创建局部变量,它声明了一个函数。我不明白。。。它创建一个局部变量s并运行其构造函数no?no,它声明一个名为
s
的函数,该函数不带任何参数并返回一个
MyRand
。谷歌“最烦人的解析”。@SebastianRedl,我搜索了一下。。。但是我可以在另一个函数中声明一个函数吗?因为这一行在
main
中。可以。您不能定义它,但可以声明它。