Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ &引用;random不命名类型;错误,即使包含定义_C++_Compilation_Forward Declaration - Fatal编程技术网

C++ &引用;random不命名类型;错误,即使包含定义

C++ &引用;random不命名类型;错误,即使包含定义,c++,compilation,forward-declaration,C++,Compilation,Forward Declaration,我一直在寻找我遇到的编译错误消息的答案,但我觉得我的用例要简单得多,这个问题甚至不应该存在。我肯定遗漏了一些非常琐碎的东西,如果能帮我找到错误,我将不胜感激 我有以下代码片段 /*file rand.h*/ class random{ // definition of class }; 和另一个名为method.h的文件 /* file method.h*/ #include "rand.h" /* lots of stuff...many lines */ class method{

我一直在寻找我遇到的编译错误消息的答案,但我觉得我的用例要简单得多,这个问题甚至不应该存在。我肯定遗漏了一些非常琐碎的东西,如果能帮我找到错误,我将不胜感激

我有以下代码片段

/*file rand.h*/

class random{
// definition of class 
};
和另一个名为method.h的文件

/* file method.h*/

#include "rand.h"

/* lots of stuff...many lines */
class method{
    random rng;
};
最后是一个cpp文件main.cpp

#include "method.h"
int main(){
    method METHOD;
    return 0;
}
在编译时,我得到一个错误:

In file included from main.cpp:2:0:
method.h:40:5: error: ‘random’ does not name a type
     random rng;
部分代码转储 方法.h

#ifndef METHOD
#define METHOD

#include "rand.h"

class node
{
//stuff
};

// stuff


template<class T>
class ssa
{
public:
    T& model;
    random rng;
};
#ifndef方法
#定义方法
#包括“rand.h”
类节点
{
//东西
};
//东西
模板
ssa类
{
公众:
T&model;
随机rng;
};
兰特

#ifndef RAND_H
#define RAND_H

#include "mtrand.h"
#include <cmath>

class random : public MTRand {

    public:

    MTRand rng;

    random(){};
    random(unsigned long seed){rng.seed(seed);};
    void seed(unsigned long _seed){
        rng.seed(_seed);
    }
    double exp(double theta){
        double inv_mean = 1.0/theta;
        double u = rng();
        return std::log(1 - u)/(-inv_mean);
    }
    double uniform(){
        return rng();
    }

};

#endif
\ifndef RAND\u H
#定义随机数
#包括“mtrand.h”
#包括
类别随机:公共MTRand{
公众:
MTRand rng;
随机(){};
随机(无符号长种子){rng.seed(seed);};
无效种子(无符号长种子){
种子;
}
双经验(双θ){
双inv_平均值=1.0/θ;
双u=rng();
返回标准::对数(1-u)/(-inv_平均值);
}
双重均匀{
返回rng();
}
};
#恩迪夫
model.h包含在主文件中

编译是通过命令进行的
g++-c-fPIC main.cpp-o main.o

有一个名为
random
的POSIX函数,在
中声明。您的类名
random
似乎与此冲突

最简单的解决方案是更改类的名称(您在一条有效的注释中说过)

由于
random()
函数是由POSIX定义的,而不是由ISO C定义的,并且是在C标准头中声明的,因此您也可以在严格符合ISO标准的模式下调用编译器。如果您使用的是gcc,
gcc-std=cNN
应该可以工作,其中
NN
90
99
11
中的一个。但这意味着您不能使用POSIX特定的函数,这可能是个问题,也可能不是


将类包装在名称空间中可能是一个更干净的解决方案(感谢Alexis Wilke的建议)。

有一个名为
random
的POSIX函数,在
中声明。您的类名
random
似乎与此冲突

最简单的解决方案是更改类的名称(您在一条有效的注释中说过)

由于
random()
函数是由POSIX定义的,而不是由ISO C定义的,并且是在C标准头中声明的,因此您也可以在严格符合ISO标准的模式下调用编译器。如果您使用的是gcc,
gcc-std=cNN
应该可以工作,其中
NN
90
99
11
中的一个。但这意味着您不能使用POSIX特定的函数,这可能是个问题,也可能不是


将类包装在名称空间中可能是一个更干净的解决方案(感谢Alexis Wilke的建议)。

您展示的代码应该可以工作。问题可能出在您尚未显示的代码中。我受过教育的猜测是循环的。你试过只编译这些片段吗?顺便说一句,您的
方法
类后面缺少一个分号,因此仅此一个分号就可以防止编译这些代码段。制作2份副本(原件和副本)。现在猜猜你认为什么与你的问题无关。删除该部分。重新编译,并确认问题是遇到的第一个错误。复制本修订版。删除更多你认为不相关的内容。测试。如果删除某些代码出错,请备份到最近的备份(确认问题仍然存在!),然后删除其他内容。首先删除低挂果实:首先删除方法主体(仅链接器错误是可以的!),.cpp文件,从未与之交互的数据,等等@Yakk使用版本控制
git checkout-b mcve
,举个例子,检查它是否显示问题,发布它,切换回主分支。我想知道您的一些include防护是否不正确。(您在
方法.h
中缺少了
#endif
,但我认为这不是问题所在。)此外,还有一个名为
random()
的POSIX函数,在
中声明;你能和那件事有冲突吗?如果更改
random
类的名称会发生什么情况?显示的代码应该可以工作。问题可能出在您尚未显示的代码中。我受过教育的猜测是循环的。你试过只编译这些片段吗?顺便说一句,您的
方法
类后面缺少一个分号,因此仅此一个分号就可以防止编译这些代码段。制作2份副本(原件和副本)。现在猜猜你认为什么与你的问题无关。删除该部分。重新编译,并确认问题是遇到的第一个错误。复制本修订版。删除更多你认为不相关的内容。测试。如果删除某些代码出错,请备份到最近的备份(确认问题仍然存在!),然后删除其他内容。首先删除低挂果实:首先删除方法主体(仅链接器错误是可以的!),.cpp文件,从未与之交互的数据,等等@Yakk使用版本控制
git checkout-b mcve
,举个例子,检查它是否显示问题,发布它,切换回主分支。我想知道您的一些include防护是否不正确。(您在
方法.h
中缺少了
#endif
,但我认为这不是问题所在。)此外,还有一个名为
random()
的POSIX函数,在
中声明;你能和那件事有冲突吗?如果更改
random
类的名称会发生什么情况?我认为他应该在所有类周围添加名称空间。这无疑可以解决问题,而不必重命名类本身(显然,这是一种重命名,因为它现在是
::random
,但它更接近pr