ISO C ++ запрещает объявление 'auto_ptr' без типа - PullRequest
1 голос
/ 03 апреля 2012

Я пытаюсь написать небольшое приложение и столкнулся с ошибкой времени компиляции с использованием auto_ptr.

Я изначально устал создавать смарт-указатель с классом, который я создал, но такая же ошибка возникает, если я пытаюсь создатьумный указатель типа int, так что должно быть что-то еще, я делаю неправильно.Я следовал примеру, приведенному здесь . .

У меня такое ощущение, что ответ на этот вопрос приведет к тому, что я ударил себя.

Я объявляю умный указатель нанижняя часть этого файла.

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <memory.h>
#include <QMainWindow>
#include "dose_calac.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    /*
     Some QT stuff here, removed for clarity / size...
    */

private:
    Ui::MainWindow *ui;

    /*
      Object for storage of data and calculation of DOSE index score.
    */

    std::auto_ptr<int> pdoseIn(new int); // A simple set case, but sill produces an error!?!

    std::auto_ptr<DOSE_Calac> pdoseIn(new DOSE_Calac); // Original code, error found here at first.
};

#endif // MAINWINDOW_H

, и это мой класс ,odium_calac.h.

#ifndef DOSE_CALAC_H
#define DOSE_CALAC_H

class DOSE_Calac
{
public:
// constructor
    DOSE_Calac();
// set and get functions live here, removed for clarity / size.

// function for caulating DOSE indexpoints
    int CalcDOSEPoints();
private:
    unsigned int dyspnoeaScale;
    unsigned int fev1;
    bool smoker;
    unsigned int anualExacerbations;
    unsigned int doseIndexPoints;

};

#endif // DOSE_CALAC_H

Любая помощь или предложение с благодарностью получены.

Ответы [ 3 ]

3 голосов
/ 03 апреля 2012

Ваша ошибка вызвана неправильным заголовком. Вместо

#include <memory.h>

вы должны написать

#include <memory>

Кроме того, в вашем определении класса есть более серьезная ошибка, потому что вы не можете инициализировать члена класса следующим образом:

std::auto_ptr<int> pdoseIn(new int);

Вы должны отдельно объявить его и инициализировать в конструкторе:

std::auto_ptr<int> pdoseIn;
MainWindow()
    : pdoseIn(new int)
{}
2 голосов
/ 03 апреля 2012

Вы не можете инициализировать элементы данных внутри объявления класса следующим образом:

class MainWindow
{
    std::auto_ptr<int> pdoseIn(new int);
};

Вам необходимо объявить член следующим образом и инициализировать элемент данных в конструкторе:

class MainWindow
{
    std::auto_ptr<int> pdoseIn;
    MainWindow ()
        : pdoseIn(new int)
    {
    }
};
2 голосов
/ 03 апреля 2012

Вы не можете инициализировать переменные-члены класса таким образом, вам нужно определить их в объявлении класса, выполнив std::auto_ptr<int> a; и инициализировать его в ctor, используя a(new int).

...