所以,我最近遇到了很大的问题。在我的工作项目中,我收到了一个json文件,并且会有一些名称off库,并带有一些方程式的实现。我的老板希望在.so文件中必须是class而不是某些程序。所以我根据这个C++: implementation of a class methods in a separated shared library
编写代码Stress.h
#ifndef STRESS_H
#define STRESS_H
#include "Model.h"
class Stress{
public:
virtual double calc(model, double, double, double);
};
#endif /* STRESS_H */
和.cpp文件
Stress.cpp
#include <math.h>
#include <iostream>
#include "Model.h"
#include "Stress.h"
class Hans_S : public Stress
{
public:
model m;
double Temperature;
double E;
double Edot;
virtual double calc(model, double, double, double);
};
double Hans_S::calc(model m, double E, double Edot, double T)
{
double s;
s = m.params[0] * pow(E,m.params[1]) * exp(((-(m.params[2]))*E)) * pow((Edot),m.params[3]) * exp(((-(m.params[4])) * (T/1000)));
return s*pow(10,6);
}
extern "C" Stress* create()
{
return new Hans_S();
}
当我像这样编译.cpp文件时
g++ -fPIC -shared Stress.cpp -o Stress.so
我收到了这个错误
Stress.cpp:25:12: error: ‘Stress’ does not name a type
extern "C" Stress* create()
^
如果有人告诉我在哪里犯了错误,我会感激不尽。当我使用像extern这样的程序时,&#34; c&#34;双重计算等它正常工作,但当我重写课堂时,它只是打我的脸......
和Model.h看起来像这样
#ifndef MODEL_H
#define MODEL_H
using namespace std;
enum Model_type
{
Stress = 0,
Strain,
S_recrystalization,
D_recrystalization,
G_growth
};
struct model
{
string name;
Model_type type;
double *params;
};
#endif /* MODEL_H */
答案 0 :(得分:3)
您的班级名为“压力”,但您的enum Model_type
也有“压力”。变种。您应该删除此冲突,或添加class
说明符:extern "C" class Stress* create()
。
答案 1 :(得分:2)
压力不是纯虚拟的,也没有实现。
virtual double calc(model, double, double, double) = 0;
会让它变成纯粹的虚拟。这就是为什么编译器说Stress不命名类型的原因,因为类是不完整的。
如果你看一下这个例子:http://ideone.com/TpwcZa你可以看到,只有你加上= 0才会编译。
(这里的工作代码:http://ideone.com/K5zdDy)
根据Keltar的说法:您可以通过两种方式解决与枚举的名称冲突:
enum class
,它有自己的命名空间。