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