ошибка std :: auto_ptr - PullRequest
       43

ошибка std :: auto_ptr

3 голосов
/ 30 марта 2011

Для приведенного ниже кода C ++ я получаю ошибку компилятора:

class Mkt
{
    int k;
public:
    Mkt(int n): k(n)
    {
        throw;
    }
    ~Mkt()
    {
        cout<<"\n\nINSIDE Mkt DTOR function:\t"<<endl;
    }
    void func1()
    {
        cout<<"\n\nINSIDE FUNC1 function....value of k is:\t"<<k<<endl;
    }
};

int main(int argc, char* argv[] )
{
    try
    {
        std::auto_ptr<Mkt> obj(new Mkt(10)); //no implicit conversion
            obj.func1(); //error C2039: 'func1' : is not a member of 'std::auto_ptr<_Ty>'
    }
    catch(...)
    {
        cout<<"\n\nINSIDE EXCEPTION HANDLER..........."<<endl;
    }
return 0;
}

Я не могу понять, почему я получаю ошибку C2039?Я использую компилятор VS 2008.

Пожалуйста, помогите.Спасибо

Ответы [ 4 ]

6 голосов
/ 30 марта 2011

Это auto_ptr, это означает, что это указатель :).Вы должны использовать operator->:

obj->func1();
5 голосов
/ 30 марта 2011

Вы должны использовать ->

obj->func1();

auto_ptr не имеет func1(), но имеет operator ->(), что даст указатель Mkt*, сохраненный внутри, а затем -> будет снова использоваться для этого указателя, и это вызовет Mkt::func1() функция-член.

2 голосов
/ 30 марта 2011

Имейте в виду, что после исправления проблемы компиляции (смените точечный оператор на -> оператор) вы столкнетесь с огромной проблемой во время выполнения.

Mkt(int n): k(n)
{
    throw;
}

throw без аргументаиспользоваться внутри catch-блоков и вызывает повторное выбрасывание обработанного исключения.Вызов внешних блокировок приведет к вызову функции abort и завершению вашей программы.Вы, вероятно, имели в виду что-то вроде

throw std::exception();

или, что лучше,

throw AnExceptionDefinedByYou();
1 голос
/ 19 апреля 2011

Это очень простая вещь в c ++. Auto_ptr - «ptr» означает «указатель»,

...