C ++中没有匹配函数:将常量标记添加到调用函数中

时间:2014-06-24 21:01:26

标签: c++ compiler-errors

我刚刚开始在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的输入必须是该输入(基于前面的代码)。

非常感谢任何帮助,

  • 威尔

2 个答案:

答案 0 :(得分:1)

你缩短const

 const arr* getArrayPtr() {}

表示“这会返回一个const指针”。

 const arr* getArrayPtr() const {}

表示“这会返回一个const指针,并且可以在const对象上调用”。否则,编译器无法判断getArrayPtr()是否不想修改调用它的对象。

由于localRunconst,其成员localRun->scatter也是const

答案 1 :(得分:0)

编译器正在寻找getArrayPtr()的定义,该定义声明它不会修改对象,因此可以安全地调用const对象。这是通过将const放在函数签名的其余部分之后完成的,就像G4double GetEdep() const一样。