簡體   English   中英

模板成員函數不能從同一類C ++中調用非模板成員函數

[英]Templated member functions cannot call non-templated member function from same class, C++

我編寫了一個處理程序中所有隨機數生成的類。 我正在嘗試在該類中實現采用向量或指向數組的指針並隨機選擇其元素之一的函數。 我正在使用這些功能的模板,以便它們可以從包含任何類型的數組或向量中進行選擇。

但是,在編譯(MSVC 2012)時,兩個模板函數均出現“錯誤C3861:'double0to1':找不到標識符”錯誤。 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);
}

由於區分大小寫,您只是有錯字。

該函數稱為double0To1 ,但您正在調用double0to1()

注意函數定義中的大寫T C ++中的標識符區分大小寫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM