2016-04-28 14 views
0

へのコールに一致しません。static_castを使用する際に問題があります。C++でエラーが表示されます。

#include <iostream> 
using namespace std; 

class Mtx { // base matrix 
private: 
    // refer to derived class 
    Mtx& ReferToDerived() { 
     return static_cast<Mtx&>(*this); 
    } 
    // entry() uses features of derived class 
    virtual double& entry(int i, int j){ 
    return ReferToDerived() (i,j); // error appears here 
    } 
protected: 
    int dimn; // dimension of matrix 
public: 
    // define common functionality in base class that can 
    // be called on derived classes 
    double sum() { // sum all entries 
     double d = 0; 
     for (int i = 0; i < dimn; i++) 
      for (int j = 0; j < dimn; j++) d += entry(i,j); 
     return d; 
    } 
}; 

class FullMtx: public Mtx { 
    double** mx; 
public : 
    FullMtx(int n) { 
     dimn = n; 
     mx = new double* [dimn] ; 
     for (int i=0; i<dimn; i++) mx[i] = new double [dimn]; 
     for (int i=0; i<dimn; i++) 
      for (int j=0; j<dimn; j++) 
       mx[i][j] = 0; // initialization 
    } 
    double& operator() (int i, int j) { return mx[i] [j]; } 
}; 

class SymmetricMtx : public Mtx { 
    // store only lower triangular part to save memory 
    double** mx ; 
public : 
    SymmetricMtx(int n) { 
     dimn = n; 
     mx = new double* [dimn]; 
     for (int i=0; i<dimn; i++) mx[i] = new double [i+1]; 
     for (int i=0; i<dimn; i++) 
      for (int j=0; j <= i; j++) 
       mx[i][j] = 0; // initialization 
    } 
    double& operator() (int i, int j) { 
     if (i >= j) return mx[i][j] ; 
     else return mx[j][i]; // due to symmetry 
    } 
}; 

int main() 
{ 
    FullMtx A(1000); 
    for (int i=0; i<1000; i++) 
     for (int j=0; j<1000; j++) 
     A(i,j)=1; 
    cout << "sum of full matrix A = " << A.sum() << '\n'; 

    SymmetricMtx S(1000); // just assign lower triangular part 
    for (int i=0; i<1000; i++) 
     for (int j=0; j<1000; j++) 
     S(i,j)=1; 
    cout << "sum of symmetric matrix S = " << S.sum() << '\n'; 
} 

私はそれを実行すると、それは言う::への呼び出しのための一致なし「(MTX)(&をint型、&をint型)」 をそして、私は私が間違っているかを理解し、どのようにすべきではありませんここに私のプログラムですそれを変更するには?仮想関数を使用して記述する必要がありますが、どのように正しく書くことができるかわかりません。誰か助けてくれますか? このプログラムは、FullMatrixとSymmetricMatrixのすべての要素の合計を数えます。

+0

'return static_cast (* this);'まったく意味がありません。 –

+0

なぜですか?どのように私はそれを変更する必要がありますか? – Caboom

+0

@Paulaこれは 'return * this;'と同じです。あなたが達成しようとしていることははっきりしていません。 – molbdnilo

答えて

0

class Mtx { 
... 
    virtual double& operator() (int i, int j) = 0; 
} 

が仮想追加ここ

virtual double& entry(int i, int j){ 
    return (*this)() (i,j); // error appears here 
} 

を仮想削除派生クラスは、その演算子とvoalaをオーバーロードしましょう。

class FullMtx: public Mtx { 
    ... 
    virtual double& operator() (int i, int j) override { return mx[i] [j]; } 
} 

これも既に指摘しているようにナンセンスです。派生型ではなく同じ型にキャストします。 さらに、ベースで完全な継承に関する情報がないため、派生型にキャストできません。誰かがあなたの知識なしにFullMtxから派生した場合はどうなりますか?

​​
+0

_ "and voala" _これは新しいものです –

+0

あなたが言ったようにバーチャルを追加して削除しました。しかし、 クラスMtx { ... 仮想double&演算子(int(int i、int j)= 0; } "仮想 '外部クラス宣言"と "' double&operator()(int、int) 'は非静的メンバー関数でなければなりません。 – Caboom

関連する問題