2013-02-21 17 views
1

對不起,如果它是一個非常基本的問題,我試圖運行下面的程序,並且我正在分段錯誤。將智能指針的明晰度轉化爲指向者類型的原始指針。

我的理解是什麼?

有一個函數proc(t),其中t通過運算符T 與T *相交。因此,在執行proc(t)函數時,我們將有一個指向T的指針類型,並且它對調用display()函數是合法的。

我想要什麼?

1)我在哪裏犯這個錯誤?

2)我的理解是否正確?

#include <iostream> 

using namespace std; 

template <typename T> 
class sPtr 
{ 
    private: 
     T * __pointee; 
    public: 

     operator T *() { 
       cout <<"Inside T*() "<<endl; 
     }; 
    explicit sPtr (T * t) 
    { 

     __pointee = t; 
    }; 
    T * operator->() { 
     return __pointee; 
    } 
}; 

class JTest 
{ 
private: 
     int x; 
public: 
    JTest (int l=100) { x=l; }; 
    void display(); 
}; 

void JTest::display() 
{ 
    cout <<"Display API x is "<<x<<endl; 
} 

void proc (JTest * tmp) 
{ 
    cout <<" proc"<<endl; 
    tmp->display(); 
    cout <<"Invoking JTest -> display "<<endl; 
} 


int main (int argc, char ** argv) 
{ 
sPtr <JTest> t(new JTest); 
t->display(); 
proc(t); // Invokes operator T*(). 

} 
+2

不要使用帶有兩個連續下劃線的標識符,它們是爲編譯器和標準庫保留的。 – Angew 2013-02-21 09:53:20

+3

你的'operator T *'不會返回任何東西。代碼甚至不應該編譯。 – Angew 2013-02-21 09:54:29

+0

這是(可能)警告,而不是錯誤 – 2013-02-21 10:02:24

回答

2

operator T*()缺少return語句,所以它顯然返回一個垃圾值(一個指向內存中的隨機地點),並取消引用該指針不是段錯誤。

你的編譯器怎麼沒有在這方面出錯是超出我的。

+0

這不是一個必需的診斷。我相信它是(至少部分)在C++ 11中引入的,所以符合的編譯器不應該在C++ 11模式下編譯這個 – sehe 2013-02-21 10:01:32

+0

@sehe你是對的,我的不好。然而,我仍然不明白爲什麼編譯器(除了Hell ++)會有不同於「這是錯誤」的默認設置。 – Angew 2013-02-21 10:29:18

+0

@angew,我的不好。忘了返回;)。謝謝。 – Whoami 2013-02-21 12:27:10

相關問題