c++ - 当我的代码在函数范围之外时,为什么会出现编译器错误 "does not name a type"?

标签 c++ c++11 random compiler-errors std

当我偶然发现这个我不理解的错误时,我正在通过在随机位置生成对象来测试我正在构建的游戏引擎。

“foo.h”:

#include <random>
#include <chrono>
#include <functional>

namespace foo {

std::default_random_engine r_gen;
auto r_seed = std::chrono::system_clock::now().time_since_epoch().count();

r_gen.seed(r_seed);  // This is the line giving an error

std::uniform_real_distribution<float> r_dist(-1.0, 1.0);
auto r_float = std::bind(r_dist, r_gen);

}

“main.cpp”:

#include <iostream>
#include "foo.h"

int main() {

    // Actually run the program

}

尝试编译此代码时出现错误消息:

error: 'r_gen' does not name a type
r_gen.seed(r_seed);
^~~~~

我正在将 Eclipse 与 MinGW 结合使用。我不确定它为什么将 r_gen 解释为一种类型。此外,将上述代码包装在一个函数中(命名空间 foo 中的所有内容)允许它正确编译。

我有一个理论问题和一个实用问题:

  • (理论)为什么我的示例代码无法编译?
  • (务实)我应该如何安排这段代码,以便它只为生成器播种一次?

最佳答案

只需改变前两个定义的顺序,并从种子构造生成器:

auto r_seed = std::chrono::system_clock::now().time_since_epoch().count();
std::default_random_engine r_gen(seed);

关于c++ - 当我的代码在函数范围之外时,为什么会出现编译器错误 "does not name a type"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58194628/

相关文章:

c++ - 将 byteArray 转换为字符串

c++ - 修改程序以加密大写和小写输入

c++ - 这种使用 std::promise 线程安全吗?

php - 随机头像生成器

perl - 生成唯一的随机字符串

C++覆盖具有不同返回类型的虚函数

c++ - 如何在 C++ 源代码中正确设置 Thrift 结构中的字段?

c++ - Clang 无法识别 <algorithm> 中的 std::all_of

c++ - 我们可以获取 xvalue 的地址吗

java - 随机答案的可能性