当我的代码超出函数范围时,为啥会出现编译器错误“未命名类型”?

Posted

技术标签:

【中文标题】当我的代码超出函数范围时,为啥会出现编译器错误“未命名类型”?【英文标题】:Why do I get the compiler error "does not name a type" when my code is outside of a function scope?当我的代码超出函数范围时,为什么会出现编译器错误“未命名类型”? 【发布时间】:2019-10-02 02:50:50 【问题描述】:

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

“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);
^~~~~

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

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

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

【问题讨论】:

你不能在函数外执行这样的语句。 @n.m 还有this one 至少有类似的答案。 重新打开。是的,有很多答案说明了为什么这不能编译。但它们都没有显示使它工作的简单修复。 【参考方案1】:

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

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

【讨论】:

以上是关于当我的代码超出函数范围时,为啥会出现编译器错误“未命名类型”?的主要内容,如果未能解决你的问题,请参考以下文章

当我指定确切的气体限制时,为啥会出现超出气体限制的错误?

JsLint'超出范围'错误

为啥我会出现超出范围的错误?

为啥 sklearn MinMaxScaler() 返回超出范围的值而不是错误?

从“未配置分区重置策略的偏移量超出范围”中恢复

当函数返回时,指向超出范围的对象的 C++ 指针 - 为啥会这样?