c++ - 梅森扭曲随机生成器函数模板的 Xcode 编译器错误

标签 c++ xcode templates

我正在尝试使用对本网站上不同帖子的回答来实现线程安全的随机数生成器。 Xcode 在一些系统提供的源代码中给我一个编译错误。我已经删除了所有的内容,这是将在最新的最新 Xcode 上重现错误的最少代码。

#include <random>
#include <climits>
using namespace std;

mt19937 * _generator = NULL;

template <typename T> T ts_rand(void)
{
    uniform_int_distribution<T> distribution(0, INT_MAX);
    static bool fInited = false;
    if (!fInited)
    {
        _generator = new mt19937();
        fInited = true;
    }
    return distribution(_generator);
}

int main(int argc, const char * argv[])
{
    int random_number = ts_rand<int>();
    return random_number;
}

当我尝试编译它时,我在文件“算法”的第 2843 行和第 2865 行中收到错误消息:“语义问题类型‘std::__1::mersenne_twister_engine * 不能在‘::’之前使用,因为它没有成员”。

如果我将 _generator 更改为实际实例而不是指针,它可以正常编译。所以这让我觉得我不理解这种模板的使用,而不是系统提供的文件中的错误。 FWIW,同样的构造在 VS 2013 上编译和运行良好。

StackOverflow 建议的类似问题似乎表明这可能与 VS 对未完全定义的模板类的慷慨解释有关,但我不知所措。

感谢任何提示。

最佳答案

您的 _generator 是一个指针,但是 uniform_int_distribution::operator()需要对 UniformRandomNumberGenerator 的引用。

你只需要做:

return distribution(*_generator);

关于c++ - 梅森扭曲随机生成器函数模板的 Xcode 编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30745119/

相关文章:

c++ - 在 C++ 中将字符串转换为 int 获得更小的值 Visual Studio 2013

c++ - 使用assert帮助编译器更好的优化

iphone - 像 safari 一样在键盘上添加一个 .com 按钮

ios - 将 UITextView 的文本从一个 View 更改为另一个 View

objective-c - 无法在 Swift 中使用 NSCoder 解码 Int

c++ - GlutSolidSphere 不是固体

C++ 字符串。为什么答案显示字符串 "dog"大于 "cat",然后 "cat"大于 "dog"?

c++ - 为具有对象或对象数组作为成员的类运行不同的代码

c++ - 二进制 '[' : no operator found which takes a left hand operand of type 'const SortableVector<int>'

azure - 适用于 Visual Studio 2022 的其他 Azure 资源管理器模板