1

申し訳ありませんが、非常に基本的な質問であれば、次のプログラムを実行しようとしていますが、セグメンテーション違反が発生しています。

私は何を理解していますか?

演算子 T によって t が T* に変換される関数 proc(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*().

}
4

1 に答える 1

2

returnoperator T*()ステートメントが欠落しているため、明らかにガベージ値(メモリ内のランダムな場所へのポインター)を返し、このポインターをsegfaultsよりも間接参照します。

なぜあなたのコンパイラがこれでエラーを起こさなかったのかは私を超えています。

于 2013-02-21T09:57:00.650 に答える