2017-02-24 8 views
4

私はそれが私はそれが何を意味し、typedef T *QScopedPointer::*RestrictedBool;を理解することに苦労しています午後12時37このtypedefはどのように機能しますか?

template<typename T, typename cleanup = QScopedPointerDeleter<T>> 
class QScopedPointer{ 

typedef T *QScopedPointer::*RestrictedBool; // how does this work? 
          //why not QScopedPointer<T> since QScopedPointer is a template? 

public: 
inline operator RestrictedBool() const 
{ 
    return isNull()? Q_NULLPTR : &QScopedPointer::d; 
} 

inline bool isNull() const{ return !d;} 

protected: 
T *d; 
}; 

でこのコードのスニペットを示し、このCPP雷がvideo 話を見ているのですか?

類似のクラスFを作成しましたが、コンパイルされません。class QScopedPointerclass Fの2つのtypedefの違いは何ですか?

template<typename T> 
class F{ 
    typedef T *F::*bool; 
    public: 
    operator bool(){return true;} 
}; 
+6

Proのヒント:その型を使って格納されている値を見てください: '&QScopedPointer :: d'はメンバポインタへのポインタです。 'typedef'の構文は' typedef 'です。注意RestrictedBoolは新しい名前であり、typedef内の新しい名前として 'bool'を使うことはできません。クラステンプレートパラメータは、独自のクラス定義内には必要ありません。 – chris

答えて

6
typedef T *QScopedPointer::*RestrictedBool; 

私たちは周りの星を移動するとき、これは明らかに少し行うことができます:C++ 11では

typedef T* QScopedPointer::* RestrictedBool; 
//  ^~~~~~~~~~~~~~~~~~~~ ^~~~~~~~~~~~~~ 
//  the type    the alias 

我々はより明確に

using RestrictedBool = T* QScopedPointer::*; 
としてこれを記述します

RestrictedBoolここでは、T* QScopedPointer::*のタイプエイリアスとして宣言されています。したがって、boolを再定義することができないため、typedef T *F::boolは失敗します。型は実際にはブール値ではないので、かなり誤解を招く場合があります。

タイプT* QScopedPointer::*は、タイプのポインタタイプです。このタイプはT*のメンバーをQScopedPointer<T, cleanup>クラスに受け入れます。我々はQScopedPointer以来ないQScopedPointer<T>がテンプレートである理由

class QScopedPointer { 
    operator RestrictedBool() const { 
//   ^~~~~~~~~~~~~~ 
//   this function returns a `RestrictedBool` = `T* QScopedPointer::*` 
     return isNull()? Q_NULLPTR : &QScopedPointer::d; 
//         ^~~~~~~~~~~~~~~~~~ 
//         and this expression has type `T* QScopedPointer::*` 
    } 

    T *d; 
// ^~~ 
// the `d` member has type `T*` in the `QScopedPointer` class. 
}; 

を参照してください? QScopedPointer<T, cleanup>インサイド

、クラス名QScopedPointerQScopedPointer<T, cleanup>の代わりに使用することができます。これはローカルに宣言された名前と呼ばれます。詳細については、C++ template name used without template parameterを参照してください。

関連する問題