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
中。可以。您不能定义它,但可以声明它。