0
#include <iostream>
#include <vector>

using namespace std;


class block{
public:
    long nx,ny;
    vector<long> s;
    block(long &x, long &y):nx(x),ny(y),vector<long> s((x+1)*(y+1),0) {}
};

int main() {
    block B(2,2);
    for(int i=1;i<=9;i++) {
        cout<<B.s(i);
    }

    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
    return 0;
}

コンパイルされたエラー メッセージは、シンボル「ベクトル」を解決できなかったことを示しています。間違いは何ですか?初期化する可変次元ベクトルを含むクラスを定義したいと考えています。


#include <iostream>
#include <vector>

using namespace std;


class block{
public:
    long nx,ny;
    vector<long> s;
    block(long &x, long &y):nx(x),ny(y),s((x+1)*(y+1),0) {}
};

int main() {
    block B(2,2);
    for(int i=0;i<=9;i++) {
        cout<<B.s[i];
    }

    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
    return 0;
}

ブロック B(2,2) でまだ問題があります。エラー メッセージ: コンストラクター "block::block" のインスタンスが引数リストと一致しません

なぜ?ありがとう!

4

2 に答える 2

4

まず:

  vector<long> s((x+1)*(y+1),0)

次のようにする必要があります。

  s((x+1)*(y+1),0)

の型を繰り返さないでくださいs。一方、コンストラクターは次のようにする必要があります。

  block(const long &x, const long &y):
    nx(x), ny(y), s((x + 1) * (y + 1), 0)
  {
  }

本当に参照が必要な場合。そうでなければ、あなたがするとき

 block B(2,2);

内部mainでは、コンストラクターがlong&int 定数を渡しているため、エラーが発生します。これについての深い理由は、左辺値と右辺値に関連しています。整数定数は右辺long&値ですが、左辺値参照である非 const long への参照です。このブログによると:左辺値、右辺値、参照

左辺値参照 (非 const 型への) は、左辺値で初期化できる参照です。まあ、const または volatile 型をレンダリングしない左辺値のみ。右辺値参照 (非 const 型への) は、右辺値で初期化できる参照です (ここでも、const 型または volatile 型を指定しない右辺値のみを使用します)。const 型への左辺値参照は、右辺値と左辺値で同様に初期化できる参照です (定数型と非定数型をレンダリングします)。

さらに、C++11 標準に従って: セクション 4.1 標準変換:

標準変換は、組み込み型に対して定義された暗黙的な変換です。標準変換シーケンスは、次の順序での標準変換のシーケンスです。

— 左辺値から右辺値への変換、配列からポインターへの変換、および関数からポインターへの変換のセットからのゼロまたは 1 つの変換。

— 次のセットからのゼロまたは 1 つの変換: 整数昇格、浮動小数点昇格、整数変換、浮動小数点変換、浮動小数点変換、ポインター変換、ポインターからメンバーへの変換、およびブール変換。

— ゼロまたは 1 つの資格変換。

右辺値から左辺値への変換はありません。これが、そのコンパイル エラーが表示された理由です。const前に追加long&すると、右辺値で初期化できるようになります。そのため、変更後にエラーがなくなります。

第二に、

  cout<<B.s(i);

次のようにする必要があります。

cout<<B.s[i];

[]ベクター要素にアクセスするには、を使用する必要があります。

3 番目に、ベクトル インデックスは から始まる0ので、

for(int i=1;i<=9;i++)

する必要があります

for(int i=0;i<9;i++)

それ以外の場合は、インデックスが範囲外になります。ここで実際の例を参照してください: http://ideone.com/YLT3mG

于 2013-05-10T02:39:32.857 に答える
3
block(long &x, long &y):nx(x),ny(y),vector<long> s((x+1)*(y+1),0) {}

vector<long>初期化リストで繰り返さないでください。参照を渡す理由もないので、アンパサンドを削除します。

block(long x, long y):
    nx(x), ny(y), s((x + 1) * (y + 1), 0)
{
}
于 2013-05-10T02:38:33.060 に答える