我正在尝试创建一个包含统一分布随机数的类。我使用Visual Studio 2010 c ++。
http://msdn.microsoft.com/en-us/library/vstudio/ee462299%28v=vs.100%29.aspx http://msdn.microsoft.com/en-us/library/ee462299.aspx
尝试了这两个链接的许多组合,但我无法找到满足我需求的解决方案。 我目前的代码是:
A)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
我正在努力一整天,现在我无法弄明白。我该如何解决这些问题?
答案 0 :(得分:3)
您不能使用()在类体中初始化成员(非静态或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};
//...
}
答案 1 :(得分:3)
当您使用C ++ 11的非静态数据成员初始值设定项初始化类定义中的数据成员时,必须使用大括号(或等于)进行初始化。如果将两条违规行更改为
,则代码将是正确的std::mt19937 _generator{1729};
std::uniform_real_distribution<> _distribution{0,1};
然而,这仍然不适用于VS2010(我认为你需要VS2013才能工作)。因此,您使用该编译器的唯一选择是在构造函数的初始化列表中执行初始化。
MyProblem::MyProblem()
: _generator(1729)
, _distribution(0,1)
{}