当我的代码超出函数范围时,为啥会出现编译器错误“未命名类型”?
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);
【讨论】:
以上是关于当我的代码超出函数范围时,为啥会出现编译器错误“未命名类型”?的主要内容,如果未能解决你的问题,请参考以下文章