2011-03-30 33 views
3

对于下面的C++代码,我得到一个编译器错误:的std :: auto_ptr的错误

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编译器。

请帮忙。 谢谢

+0

为什么有关隐式转换的评论?您并未请求隐式转换。 – 2011-03-30 09:15:15

+0

@ Kiril-Kirov同样,当我通过将auto_ptr引入Mkt *来更改我的代码时:'std :: auto_ptr obj(new Mkt(10)); \t \t obj-> func1();'我再次得到以前的错误。我试图将函数调用为:'obj.func1(); '但仍然有同样的错误。我无法理解这个 – XMarshall 2011-03-30 09:16:44

+0

@ Tomalak-Geretkal是的,我试图提醒自己我没有要求隐式转换的语法。这就是为什么评论( - : – XMarshall 2011-03-30 09:18:59

回答

6

这是auto_ptr,这意味着,它是指针:)。您必须使用operator->

obj->func1(); 
+0

gr8 ..感谢您的帮助 – XMarshall 2011-03-30 09:04:14

5

你必须使用->

obj->func1(); 

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

2

请注意,修复编译问题(将点运算符更改为 - >运算符)后,您将遇到巨大的运行时问题。

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

throw没有参数是指捕获块和原因重新投掷处理的异常内使用。调用外部catch-blocks将导致致电abort函数并终止程序。 你大概意思是这样

throw std::exception(); 

,或者更好,

throw AnExceptionDefinedByYou(); 
+0

确实...感谢您的信息( - : – XMarshall 2011-03-30 09:40:29

1

这是C++ .. auto_ptr的很基本的东西 - “PTR” 代表 “指针”,