Почему я получаю ошибку компилятора "не называет тип", когда мой код находится за пределами области действия функции? - PullRequest
0 голосов
/ 02 октября 2019

Я тестировал игровой движок, который строил, генерируя объекты в случайных положениях, когда наткнулся на эту ошибку, которую я не понимаю.

"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) позволяет правильно ее компилировать.

У меня есть теоретический вопрос и прагматический вопрос:

  • (Теория) Почему мой пример кода не компилируется?
  • (Pragmatic) Как мне организовать этот код так, чтобы он только запустил генератор один раз?

1 Ответ

1 голос
/ 02 октября 2019

Просто измените порядок первых двух определений и создайте генератор из начального числа:

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