2011-03-30 34 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」 代表 「指針」,