0

valarray とそのサイズを定義する 2 つの int を含むクラスを実装しようとしています。私の hpp ファイルは次のようになります。

class Matrix
{
public:
    // Constructors
    Matrix();
    Matrix(int width, int height);

    // Mutators
    void setWidth(int width);               // POST: width of the matrix is set
    void setHeight(int height);             // POST: height of the matrix is set
    //void initVA(double width);

    // Accessors
    int getWidth();                         // POST: Returns the number of columns in the matrix
    int getHeight();                        // POST: Returns the number of rows in the matrix

    // Other Methods
    //void printMatrix(const char* lbl, const std::valarray<double>& a);

private:

    int width_;
    int height_;
    std::valarray<double> storage_;
};

ただし、次のようにコンストラクターで valarray を初期化しようとすると:

Matrix::Matrix(int width, int height)
{
    width_ = width;
    height_ = height;
    storage_(width*height);
}

次のエラー メッセージが表示され続けます。

エラー C2064: 項は 1 つの引数を取る関数として評価されません

ドキュメントには、少なくとも 5 つの異なる方法で valarray を宣言できると書かれていますが、デフォルトのコンストラクターのみが機能します。私はどこでも見ましたが、有用な情報を見つけることができませんでした。どんな助けでも大歓迎です。

4

1 に答える 1

3

実際にここで呼び出そうとしてstd::valarray<double>::operator()(int)いますが、そのような演算子は存在しません。おそらく、代わりに初期化リストを使用するつもりでした:

Matrix::Matrix(int width, int height)
    : width_(width),
      height_(height),
      storage_(width*height)
{
}

または、代わりに新しいオブジェクト インスタンスを割り当てることもできますが、これは初期化リストを使用するよりもパフォーマンスが低くなります。これは、storage_デフォルトで構築され、新しい一時オブジェクトのコピーに置き換えられ、最終的に一時オブジェクトが破棄されるためです。(まともなコンパイラはこれらのステップのいくつかを排除できるかもしれませんが、私はそれに頼りません。)

storage_ = std::valarray<double>(width*height);
于 2013-05-08T16:22:40.790 に答える