我一直在寻找我正在遇到的编译错误消息的答案,但我似乎我的用例更简单,而且这个问题甚至不应该存在。我当然错过了一些非常微不足道的事情,并希望找到错误的帮助。
我有以下代码片段。
/*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;
method.h
#ifndef METHOD
#define METHOD
#include "rand.h"
class node
{
//stuff
};
// stuff
template<class T>
class ssa
{
public:
T& model;
random rng;
};
rand.h
#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
model.h包含在主文件中。
使用该命令进行编译
g++ -c -fPIC main.cpp -o main.o
答案 0 :(得分:5)
在random
中声明了一个名为<stdlib.h>
的POSIX函数。您的班级名称random
似乎与此相冲突。
最简单的解决方案是更改类的名称(您在评论中说明了这一点)。
由于random()
函数由POSIX定义但未由ISO C定义,并且在C标准头中声明,因此您也可以在严格的ISO符合模式下调用编译器。如果您使用的是gcc,则gcc -std=cNN
应该有效,其中NN
是90
,99
或11
之一。但这意味着你不能使用POSIX特定的功能,这可能是也可能不是问题。
将命名空间中的类包装起来可能是一个更清晰的解决方案(感谢Alexis Wilke提出的建议)。