2016-12-13 8 views
2

私はMS Visual Studio 2015のC++コンパイラでQtGStreamerを使用しようとしています。これはデフォルトでC++ 11標準(多かれ少なかれ)になっています。QtGStreamerはC++ 11標準によるヘッダーのコンパイル時エラーですか?

ヘッダrefpointer.hには次のものが含まれます。

template <class T, class X> 
struct RefPointerEqualityCheck<T, X*> 
{ 
    static inline bool check(const RefPointer<T> & self, X* const & other) 
    { 
     return self.m_class ? self.m_class->m_object == other : !other; 
    } 
}; 

...以降refpointer.hに、我々は次のようにあります。他に

template <class T> 
template <class X> 
bool RefPointer<T>::operator==(const X & other) const 
{ 
    return Private::RefPointerEqualityCheck<T, X>::check(*this, other); 
} 

template <class T> 
template <class X> 
bool RefPointer<T>::operator!=(const X & other) const 
{ 
    return !Private::RefPointerEqualityCheck<T, X>::check(*this, other); 
} 

誰かが私は、エラーメッセージに遭遇しました得ることhere

qt5gstreamer\qglib\refpointer.h(280): error C2039: 'check': is not a member of 'QGlib::Private::RefPointerEqualityCheck<T,X>' 
     with 
     [ 
      T=QGst::BufferList, 
      X=int 
     ] 

QtGStreamerレプリケーションの主な貢献者

Hmのように、コードにはC++ 11の nullptrをサポートするための追加が必要なようです。 C++ 11 機能(cmakeを使用している場合はQTGSTREAMER_FLAGSを含む)と を有効にするコンパイラフラグを削除してみてください。また、これについてバグレポート を開くと、うれしいでしょう。

2つのこと:

(1)私はそれがヘッダーを修正(多分パッチを提出)することが可能です場合はC++ 11件の規格がサポート落とさないようしたいと思います。

(2)MSVC++ 15には、オプションがあります(私はグーグルで簡単に見つけることができませんでした)。コンパイラのメッセージが言うに反し

、それはcheckはあなたがQtGStreamer源でhere(ヘッダのバージョンを見ることができるように実際にQGlib::Private::RefPointerEqualityCheckのメンバーとして定義されていること素人目に見えることと同じであるもの。私は私のシステムで使用しています)

Q:上記のを、コードに何か問題があります。問題を解決するためにQtGstreamerに寄与できるもの。それとも、C++標準の以前のバージョンでコンパイルしたほうがいいですか?

答えて

2

私のコンパイラは実際に私が遭遇した問題の起源を指摘していません。 RefPointer等価チェックのテンプレートパラメータは、巨大ヒントです。

Iが一定NULLRefPointer Sを比較したので、私は(intにコンパイル)0から#define Dであり、これに遭遇しました。

ような何かやってたときにこのように、:

BufferListPtr buf; //An instance of RefPointer 
//I thought that BufferListPtr was equivalent to `QGst::Buffer*` but apparently it has some overloaded operators, which is the source of our problem! 
if(buf == NULL) //Compile-time error! 

をコンパイラがRefPointeroperator==機能を起動しようとするが、それは(それが唯一あなたが通過することを可能にするintXパラメータには適用されないことを発見ポインタ()または他のRefPointer秒インチ)

つまり、あなたのQtGstreamerコードを通過し、あなたがRefPointerを比較して、すべての時間を見つけなければなりません==または!=、以下のようにそれらを修正してNULLのインスタンス:心に留めておくべき

if(ptr.isNull()) 

事がすべてRefPointerインスタンスが、ないポインタであるということです。 Visual C++の世界(私のような)から来て、LPCSTR*CSTRに追加する単純なマクロになると期待している場合は、PtrのクラスとRefPointerで何が行われるのか混同しないでくださいQtGstreamer! RefPointer(たとえば、ElementPtr)を宣言すると、実際にはクラスのインスタンスがスタックに割り当てられるため、NULLと比較すると意味がありません。

isNull()を呼び出すと、NULLになっているかどうかを確認することができます。なぜなら、クラスをスタックに割り当てて、ElementPtr*というような奇妙なことをしていないと、クラスは常に初期化されるからです。あなたが値として扱うのではなくする必要があるので、結論として

RefPointerPtrで終わるQtGstreamerオブジェクトタイプを含む、それのすべてのサブクラスは、、は生のC型へポインタをカプセル化することだけでクラスですポインタ。

+0

これは、 'NULL'に対するチェックを' nullptr'で置き換える主な理由です。それはあなたに誤りをもたらしたでしょう。あなたが何かがnullであるかどうかを確認する唯一の時間はポインタ型です。 'RefPointer'はポインタをラップしますが、ポインタ型ではありません。ポインタの型は 'int *'、 'char *'、 'RefPointer *'のように 'T *'です。 – NathanOliver

+0

ええ、私は最終的に答えに書かれているように 'RefPointer'(ポインタ型ではない)についてその事実を理解しました。 'nullptr'についてのヒントをありがとう。私は将来それを必ず使用します。 'RefPointer'のセマンティクスが実際のポインタに似ているのは奇妙ですが、さまざまな" gotchas "は動作しません。例えば、ラップされた生の型の関数を呼び出すには、 ' - >'を使う必要があります(それにはオーバーロードされた演算子もあります)。面白い... – allquixotic

関連する問題