std::auto_ptr 错误

3

对于下面的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编译器。

请帮忙解决,谢谢。


为什么要提到隐式转换?你并没有请求隐式转换。 - Lightness Races in Orbit
@Kiril-Kirov 当我将我的代码更改为使用Mkt*来代替auto_ptr时:'std::auto_ptr<Mkt*> obj(new Mkt(10)); obj->func1();',我又再次遇到了之前的错误。我尝试将函数调用改为:'obj.func1();',但仍然出现相同的错误。我无法理解这个问题。 - XMarshall
@Tomalak-Geretkal 是的,我正在试图提醒自己的语法,我不要求隐式转换。这就是为什么有注释 (-:。 - XMarshall
4个回答

6

这里涉及到的是 auto_ptr,它意味着它是一个指针 :). 你必须使用 operator->

obj->func1();

5

您需要使用->

obj->func1();
auto_ptr没有func1(),但它有operator ->(),它将产生存储在内部的Mkt*指针,然后再次使用->该指针,这将调用Mkt::func1()成员函数。

2
请注意,在您修复编译问题(将点运算符更改为 -> 运算符)后,您将遇到一个巨大的运行时问题。
Mkt(int n): k(n)
{
    throw;
}

throw语句如果没有参数,通常用于在catch块中,可以重新抛出已处理的异常。如果在catch块之外使用,则会调用abort函数,导致程序终止。 你可能想要使用类似以下的语句:

throw std::exception();

或者更好的是,
throw AnExceptionDefinedByYou();

1

这是C++中非常基础的东西.. auto_ptr - "ptr"代表指针,


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接