0

プログラムですべての乱数生成を処理するクラスを作成しました。そのクラス内に、配列へのベクトルまたはポインターを取り、それらの要素の 1 つをランダムに選択する関数を実装しようとしています。これらの関数にはテンプレートを使用しているため、任意の型を含む配列またはベクトルから選択できます。

ただし、コンパイルすると (MSVC 2012)、両方のテンプレート関数で「エラー C3861: 'double0to1': identifier not found」というエラーが発生します。double0To1 は、そのクラスのパブリック メンバー関数です。

rng.h で:

#ifndef RNG_H
#define RNG_H

#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_real_distribution.hpp>
#include <boost/random/variate_generator.hpp>
#include <vector>

class RNG
{
public:
    RNG(int seedIn);
    ~RNG(void);

    double double0To1();
    int positiveIntLessThan(int upperBound);

    template<class T> T* randomObjectInVector(std::vector<T*> vectorToChooseFrom);
    template<class T> T* randomObjectInArray(T** arrayToChooseFrom, int size);

private:
    int seed;
    boost::random::uniform_real_distribution<double> *distribution0To1;
    boost::mt19937 generator;
    boost::random::variate_generator<boost::mt19937, boost::random::uniform_real_distribution<double>> *mersenne0To1;
};

template<class T> T* RNG::randomObjectInVector(std::vector<T*> vectorToChooseFrom)
{
    double randNum=double0to1();
    double step=1/vectorToChooseFrom.size();

    int indexToTake=floor(randNum/step);

    return vectorToChooseFrom[indexToTake];
}

template<class T> T* RNG::randomObjectInArray(T** arrayToChooseFrom, int size)
{
    double randNum=double0to1();
    double step=1/size;

    int indexToTake=floor(randNum/step);

    return &((*arrayToChooseFrom)[indexToTake]);
}

そして rng.cpp で:

#include "stdafx.h"
#include "RNG.h"


RNG::RNG(int seedIn)
{
    seed=seedIn;
    generator.seed(seed);
    distribution0To1=new boost::random::uniform_real_distribution<double>(0, 1);
    mersenne0To1=new boost::random::variate_generator<boost::mt19937, boost::random::uniform_real_distribution<double> >(generator, *distribution0To1);
}

RNG::~RNG(void)
{
    delete distribution0To1;
}

double RNG::double0To1()
{
    return (*mersenne0To1)();
}

int RNG::positiveIntLessThan(int upperBound)
{
    double randomValue=double0To1();

    return int(upperBound*randomValue);
}
4

1 に答える 1

2

大文字と小文字が区別されるため、タイプミスがあります。

関数は呼び出されdouble0To1ていますが、あなたは呼び出していますdouble0to1()

T関数定義の大文字に注意してください。C++ の識別子は大文字と小文字が区別されます。

于 2013-10-02T21:09:29.917 に答える