我刚刚开始在C ++领域进行冒险,所以这可能是一个愚蠢的问题。我从编译器中收到以下错误。
Run.cc:56:错误:没有匹配函数来调用'sphereDetect :: getArrayPtr()const' /spheredetect.hh:18:注意:候选人是:const G4long(* sphereDetect :: getArrayPtr())[36] [72] [60]
我的Run.hh是:
#include "spheredetect.hh"
#include "G4Run.hh"
#include "globals.hh"
class G4Event;
/// Run class
///
class Run : public G4Run
{
public:
Run();
virtual ~Run();
// method from the base class
virtual void Merge(const G4Run*);
void AddEdep (G4double edep);
// get methods
G4double GetEdep() const { return fEdep; }
G4double GetEdep2() const { return fEdep2; }
private:
G4double fEdep;
G4double fEdep2;
sphereDetect scatter;
};
我的Run.cc是:
#include "Run.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
Run::Run()
: G4Run(),
fEdep(0.),
fEdep2(0.),
scatter()
{}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
Run::~Run()
{}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void Run::Merge(const G4Run* run)
{
const Run* localRun = static_cast<const Run*>(run);
fEdep += localRun->fEdep;
fEdep2 += localRun->fEdep2;
arr* scatterPointer = localRun->scatter.getArrayPtr();
scatter.sphereMerge(scatterPointer);
G4Run::Merge(run);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void Run::AddEdep (G4double edep)
{
fEdep += edep;
fEdep2 += edep*edep;
}
,我的sphereDetect.hh是:
typedef G4long arr[36][72][60];
class sphereDetect
{
public:
sphereDetect();
~sphereDetect();
const arr* getArrayPtr() {return &scatterArray;}
void sphereMerge(arr*);
void createHit(G4ThreeVector,G4double);
protected:
void storeHit(G4int,G4int,G4int);
G4int findAngNS(G4ThreeVector);
G4int findAngEW(G4ThreeVector);
G4int findEnergy(G4double);
void sphereSave();
private:
G4long scatterArray[36][72][60];
};
我很遗憾如何解决这个问题。它是我构造或调用sphereDetect类的方式吗?有一点可以肯定的是,Run.Merge的输入必须是该输入(基于前面的代码)。
非常感谢任何帮助,
答案 0 :(得分:1)
你缩短const
。
const arr* getArrayPtr() {}
表示“这会返回一个const指针”。
const arr* getArrayPtr() const {}
表示“这会返回一个const指针,并且可以在const对象上调用”。否则,编译器无法判断getArrayPtr()
是否不想修改调用它的对象。
由于localRun
为const
,其成员localRun->scatter
也是const
。
答案 1 :(得分:0)
编译器正在寻找getArrayPtr()
的定义,该定义声明它不会修改对象,因此可以安全地调用const
对象。这是通过将const
放在函数签名的其余部分之后完成的,就像G4double GetEdep() const
一样。