2016-12-31 19 views
-1

私は仮想関数updateCustom()と別の基本関数checkNeighbours()を持つクラスTableauを持っています。 私は、updateCustom()をオーバーライドする、Tableau、JeuTaquinから派生した別のクラスを持っています。 updateCustomの中では、checkNeighbours()を呼びたいのですが、エラーが出ます。私のクラスのタブロー内部継承と仮想関数

私の2つの機能:次に

template<class T> 
void updateCustom(char input) //Virtual function in .h 
{} 

template<class T> 
Case<T>* Tableau<T>::checkNeighbours(const Case<T> **&plateau, int i, int j) 
{ 
//No need to see what is inside this function 
Case<T> *neighbours; 
neighbours = new Case<T>[4]; 
for(int n = 0; n<taille;n++) 
    neighbours[n] = nullptr; 
if(i!=0) 
    neighbours[0] = plateau[i-1][j]; 
if(j!=taille) 
    neighbours[1] = plateau[i][j+1]; 
if(i!=taille) 
    neighbours[2] = plateau[i+1][j]; 
if(j!=0) 
    neighbours[3] = plateau[i][j-1]; 

return neighbours; 
} 

(タブローから派生)JeuTaquin内側:

template<class T> 
void JeuTaquin<T>::updateCustom(char input) 
{ 
//Here is my function checkNeighbours that I want to call 
    Case<T> *neighbours = Tableau<T>::checkNeighbours(Tableau<T>::plateau1, 2, 2); 

} 

私がコンパイルしようとすると、私が手:

JeuTaquin.cpp:54:71: error: no matching function for call to ‘JeuTaquin<int>::checkNeighbours(Case<int>**&, int, int)’ 
neighbours = Tableau<T>::checkNeighbours(Tableau<T>::plateau1, 2, 2); 
JeuTaquin.cpp:54:71: note: candidate is: 
In file included from JeuTaquin.h:5:0, 
      from JeuTaquin.cpp:1: 
Tableau.h:78:11: note: Case<T>* Tableau<T>::checkNeighbours(const Case<T>**&, int, int) [with T = int] 
Case<T>* checkNeighbours(const Case<T> **&plateau, int i, int j); 
Tableau.h:78:11: note: no known conversion for argument 1 from ‘Case<int>**’ to ‘const Case<int>**&’ 

私は、私が上書きしたupdateCustom()内でcheckNeighboursを認識できないのか分かりません。私のインクルードはOKですし、JeuTaquinのコンストラクタでTableauの関数を呼び出してもうまくいきます!あなたの助け

EDITをありがとう:私はこのようTableau.hで私updateCustom機能を宣言します。

virtual void updateCustom(char input); 
+0

'checkNeighbours'はどのように宣言されていますか?public、private、protected?非公開の場合、別のクラスからアクセスすることはできません。 – Barmar

+0

checkNeighboursが公開されています –

+0

あなたの 'updateCustom'が奇妙に見えています。そのテンプレートと非仮想で、偶数のメソッドか自由な関数があればもっとコードを追加できますか? –

答えて

1

それはconst Type**Type**をキャストすることは違法です。

http://c-faq.com/ansi/constmismatch.htmlを参照してください。

+0

私はconstを消去し、それは動作します、ありがとう! –

+0

'**&'の混乱によって引き起こされた問題を修正するためにウィンドウのconstの正確さを投げ捨てることは、私にとっては悪い習慣のようです。 – Unimportant

+0

問題は参照とは関係ありません。ポインターへのポインターを扱うときにconstの正確さを維持することは、通常のポインターを扱うときよりもはるかに困難です。実際の問題は、まずポインタへのポインタを使用することですが、それは別の話です。 – Frank