2016-11-24 3 views
1

私はコンパイルのカップルを与えるC++ソフトウェアをコンパイルしたい エラー。このエラーは、解決できないメンバ関数に関するものです。継承されたメンバ関数は宣言されていないようですが、何が起こっていますか?

この質問には、回答に必要なすべてが含まれている必要があります。しかし、その が実際に該当する場合、私は今答えを見つけたはずです。ですので source codeをご覧ください。 この質問のすべてのコードは私のものではなく、GPLv2の下でライセンスされています。

私はコンパイルシステムは、Red Hat Enterprise Serverの 6.8を実行しているIBMのPowerPC 740です。モジュールを使って、私はClang 3.7を有効にしました。すべてがIBM PowerPC A2チップ用にクロスコンパイルされた です。これはIBM BlueGene/Qスーパーコンピュータです。で世話をしなければならない それらのもの、私のcompilation script必要な多くのconfigureCXXFLAGSを設定します 。

私は現在、私の現在の状態を取得するコンパイルエラー(コミット fee0a02)は、このいずれかになります。

bfmcommqmp.C:183:5: error: use of undeclared identifier 'gather' 
    gather(result_cb, psi, dag); 
    ^

問題のある行はbfmcommqmp.Cで、このメソッドの定義である:

168 template <class Float>               
169 void bfmcommQMP<Float>::comm_start(int result_cb, Fermion_t psi, int dag) {  
170  // gather the faces. Routines here are threaded.        
171  // All threads cooperate in gathering.          
172                     
173  // if (this->isBoss() && (me == 0)) {          
174  // this->Error("comm_start checking heap\n"); fflush(stdout);    
175  // mcheck_check_all();             
176  // this->Error("comm_start mcheck_all");fflush(stdout);     
177  // }                  
178                     
179  int me = this->thread_barrier();            
180                     
181  this->thread_barrier();              
182                     
183  gather(result_cb, psi, dag);             
184                     
185  this->thread_barrier();              
186  if (me == 0) {                
187   comm_qmp_start(psi);              
188  }                   
189  this->thread_barrier();              
190                     
191  return;                  
192 } 

もちろんこれはbfmcommQMPクラスの一部です。それはbfmbaseから継承

8 template <class Float>               
    9 class bfmcommQMP : public bfmbase<Float> {          
10 public:                  
11  // QMP thingy-me-bob's              
12  QMP_msghandle_t multi_handle[2];            
13                     
14  QMP_msgmem_t send_ops_msgmem_t[8];           
15  QMP_msgmem_t recv_ops_msgmem_t[8];           
16                     
17  QMP_msghandle_t send_multi_handle;           
18  QMP_msghandle_t send_handles[8];            
19                     
20  QMP_msghandle_t recv_handles[8];            
21  QMP_msghandle_t all_handles;             
22                     
23  Float *simd_rbuf[8];               
24  Float *receive_area;               
25                     
26  int num_op;                 
27                     
28  virtual bool isBoss();              
29                     
30  virtual void recv_init(void);            
31  virtual void recv_end(void);             
32                     
33  virtual void comm_init(void);            
34  virtual void comm_end(void);             
35  virtual void comm(int result_cb, Fermion_t psi, int dag);     
36  virtual void comm_start(int result_cb, Fermion_t psi, int dag);    
37  virtual void comm_qmp_start(Fermion_t psi);         
38  virtual void comm_qmp_complete(void);          
39  virtual void comm_merge(void);            
40  virtual void comm_complete(int result_cb, Fermion_t psi);     
41  virtual void comm_gsum(double &val);           
42  virtual void comm_gsum(double *val, int N);         
43 }; 

:関連する ヘッダファイル、bfmcommqmp.hを見てみると、一つは、このクラスの宣言を検索します。私の理解から

133 template <class Float>               
134 class bfmbase : public bfmarg, public ThreadModel {        
135 public: 

282  void gather(int result_cb, Fermion_t psi, int dag); 
283  void gather(int mu, int result_cb, Fermion_t psi, int dag); 

1018 }; 

bfmcommQMPから 非仮想関数gatherを継承している必要がありますクラス: bfmcommqmp.hに含まれているファイルbfm.hにジャンプする、我々は2つのgather メソッドを含むクラス定義を、見つけますbfmbase。明らかにそうでない場合、 そうでなければClangはそれについて不平を言わないでしょう。

私はここで何が欠けていますか?なぜ機能が bfmcommQMP::comm_startのメンバー機能の中で利用できないのですか?gather

答えて

2

問題は、あなたの派生クラスがdependent nameであるということです。代わりにthis->gather()で基本クラスのgather()への呼び出しを修飾する必要があります。それ以外の場合、コンパイラは基本クラスからgather()を解決しません。これはまた、なぜ他のすべてを説明しWhy do I have to access template base class members through the this pointer?

+0

:簡素化するために、

template<class T> struct Base { void f(); }; template<class T> struct Derived: Base<T> // dependent name { void foo() { this->f(); // won't compile without this-> } }; 

代替は派生Derived::foo()

using Base::f; 

を行うか

Base::f(); 

などのコール関連を修飾することですそのメソッドの呼び出しには 'this->'が前置されています!今私はいくつかの他のコンパイルエラーを得て、これは解決されるようだ。どうもありがとう、私は他の場所を探していて、このようなことが原因であるとは思わなかったでしょう。 –

+0

ようこそ。 [C++のテンプレート:完全なガイド](https://www.amazon.com/Templates-Complete-Guide-David-Vandevoorde/dp/0201734842)は、テンプレートに関する最良の書籍です。テンプレート。 Old(2002)でも、まだまだ関連性が高い。著者は現代のC++(C++ 11以降)へのアップデートに取り組んでいます。 – vsoftco

関連する問題