我正在尝试创建一个包含均匀分布随机数的类。我用的是Visual Studio 2010 c++。
http://msdn.microsoft.com/en-us/library/vstudio/ee462299%28v=vs.100%29.aspxhttp://msdn.microsoft.com/en-us/library/ee462299.aspx
从这两个链接中尝试了许多组合,但我找不到适合我需要的解决方案。我现在的代码是:
) MyProblem.h
#include <random>
class MyProblem
{
public:
int calculateMyProblem();
private:
double _uniformRandNum;
std::mt19937 _generator(1729); // for 1729 I get ERROR: Expected a type specifier
std::uniform_real_distribution<> _distribution(0,1); // for both 0 an 1 i get ERROR: Expected a type specifier
void generateUniformDistrNum();
void calculateMeanDistance();
};
对于这两行,我得到错误
error C2059: syntax error : 'constant'
error C2059: syntax error : 'constant'
B) MyProblem.cpp
MyProblem::MyProblem()
{}
int MyProblem::calculateMyProblem()
{
generateUniformDistrNum();
// other stuff to be done with random number _uniformRandNum
}
void MyProblem::generateUniformDistrNum()
{
_uniformRandNum = (double) _distribution(_generator); // ERROR, see below
}
生成的错误如下:
error C3867: 'MyProblem::_generator': function call missing argument list; use '&MyProblem::_generator' to create a pointer to member
error C2660: 'MyProblem::_distribution' : function does not take 1 arguments
我试了一整天都没弄明白。我该如何解决这些问题?
当您使用c++ 11的非静态数据成员初始化器来初始化类定义中的数据成员时,必须使用大括号(或相等)来进行初始化。如果将这两行修改为
,代码将是正确的。std::mt19937 _generator{1729};
std::uniform_real_distribution<> _distribution{0,1};
现场演示
然而,这仍然不能在VS2010上工作(我认为你需要VS2013才能工作)。所以你唯一的选择就是在构造函数的初始化列表中执行初始化。
MyProblem::MyProblem()
: _generator(1729)
, _distribution(0,1)
{}
不能使用()在类主体中初始化成员(非静态或const成员)。您需要在构造函数初始化列表中或在构造函数的主体中(或在一个源文件中的类定义之外,如静态成员)执行此操作:
头文件:
class MyProblem
{
public:
int calculateMyProblem();
private:
double _uniformRandNum;
std::mt19937 _generator;
std::uniform_real_distribution<> _distribution;
void generateUniformDistrNum();
void calculateMeanDistance();
};
源文件:MyProblem::MyProblem() : _generator( 1729), _distribution( 0, 1) {}
//... the rest of function defs
在c++ 11中,你可以使用{}来初始化类主体中的成员:
class MyProblem {
//...
std::mt19937 _generator{1729};
std::uniform_real_distribution<> _distribution{0,1};
//...
}