私は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++標準の以前のバージョンでコンパイルしたほうがいいですか?
これは、 'NULL'に対するチェックを' nullptr'で置き換える主な理由です。それはあなたに誤りをもたらしたでしょう。あなたが何かがnullであるかどうかを確認する唯一の時間はポインタ型です。 'RefPointer'はポインタをラップしますが、ポインタ型ではありません。ポインタの型は 'int *'、 'char *'、 'RefPointer *'のように 'T *'です。 – NathanOliver
ええ、私は最終的に答えに書かれているように 'RefPointer'(ポインタ型ではない)についてその事実を理解しました。 'nullptr'についてのヒントをありがとう。私は将来それを必ず使用します。 'RefPointer'のセマンティクスが実際のポインタに似ているのは奇妙ですが、さまざまな" gotchas "は動作しません。例えば、ラップされた生の型の関数を呼び出すには、 ' - >'を使う必要があります(それにはオーバーロードされた演算子もあります)。面白い... – allquixotic