2013-05-08 3 views
0

Я пытаюсь реализовать класс, содержащий valarray и 2 ints, которые определяют его размер. Мой файл HPP выглядит примерно так:Не удается инициализировать valarray как частный член класса

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 аргумент

The documentation говорит, что я могу объявить valarray не менее чем 5 различными способами, но работает только конструктор по умолчанию. Я везде искал, но не нашел никакой полезной информации. Любая помощь будет оценена по достоинству.

+1

Используйте список инициализаторов. То, что вы пытаетесь сделать, недействительно, поскольку a) недействительный синтаксис b) элемент уже инициализирован в этой точке. –

+0

@LuchianGrigore Синтаксис действительно действителен, он просто ссылается на 'operator()' перегрузка, которая не существует. (И это, вероятно, не будет делать то, что OP хочет, если он существует.) – cdhowie

+0

@cdhowie, вы правы, я имел в виду недействительный синтаксис инициализации. Я вижу, как я был слишком краток. –

ответ

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); 
+0

Это решило проблему! Однако я не вижу разницы. Прошло некоторое время с тех пор, как я использовал C++, и у меня много проблем. Почему инициализация. list вызывает оператор «()», но не тот код, который у меня был первоначально? – Oniros

+0

@Oniros Список инициализаторов заменяет любую инициализацию по умолчанию членов объекта, выполняемую компилятором. Синтаксис, необходимый для инициализации в этом списке и для назначения вне списка, совершенно другой. – cdhowie

+1

@Oniros Код, который вы изначально имели * сделал * попытался вызвать 'operator()', у вас есть это в обратном порядке. Синтаксис списка инициализаторов имитирует синтаксис построения переменных (например, 'std :: valarray foo (5);'). 'a (b)' имеет другое значение в списке инициализатора и вне его. В инициализаторе это означает «инициализировать' a' - 'b'", а вне его - «invoke» operator() 'on' a', передавая 'b'." – cdhowie

Смежные вопросы