Я пытаюсь реализовать класс, который содержит 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 аргумент
Документация говорит, что я могу объявить valarray как минимум 5 разными способами, но работает только стандартный конструктор. Я искал везде, но не смог найти никакой полезной информации. Любая помощь будет оценена.
Вы на самом деле пытаетесь вызвать 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);
Других решений пока нет …