我正在尝试将QtGStreamer与MS Visual Studio 2015的C ++编译器一起使用,该编译器默认使用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的主要贡献者之一回复如下:
嗯,看起来代码需要一些补充来支持C ++ 11 nullptr。尝试删除启用C ++ 11的任何编译器标志 功能(如果你使用的是cmake,包括QTGSTREAMER_FLAGS)和 走着瞧吧。此外,如果您打开错误报告会很好 对这个。
两件事:
(1)如果可以修复标题(并且可能提交补丁),我想避免放弃C ++ 11标准支持;和
(2)我甚至不确定MSVC ++ 15是否有选项可以回到早期的标准版本(谷歌搜索时我无法轻易找到它)。
与编译器消息所说的相反,未经训练的眼睛看来check
确实被定义为QGlib::Private::RefPointerEqualityCheck
的成员,你可以看到{{3}在QtGStreamer源代码中(该版本的标题与我在系统中使用的版本相同。)
问:鉴于上述情况,我的代码有问题;可以帮助QtGstreamer解决问题的东西;或者我最好不要编译早期版本的C ++标准?
答案 0 :(得分:2)
事实证明,我的编译器没有指出我遇到的问题的实际起源。 RefPointer相等性检查的模板参数是巨大的提示。
我遇到了这个,因为我将RefPointer
与常量NULL
进行比较,#define
d到0
(编译成int
)。
因此,在做类似的事情时:
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!
编译器尝试调用RefPointer
的{{1}}函数,但发现它不适用于operator==
的{{1}}参数(它只允许您传递指针(X
)或其他int
。)
因此,您必须查看QtGstreamer代码并查找将X*
实例与RefPointer
与RefPointer
或NULL
进行比较的所有时间,并将其修复为如下:
==
要记住的是所有RefPointer实例都是值,而不是指针 。如果您来自Visual C ++世界(就像我一样),并且您希望!=
是一个简单的宏,将if(ptr.isNull())
添加到LPCSTR
,请不要与*
类和CSTR
在QtGstreamer中所做的事情混淆了!声明Ptr
(例如,RefPointer
)实际上会立即在堆栈上分配类的实例,因此将其与NULL进行比较是没有意义的。
但是你可以在它上面调用RefPointer
来查看它是否为NULL,因为如果你在堆栈上分配它并且你没有做一些奇怪的事情就像声明一个{{1 }}
总之,ElementPtr
及其所有子类,包括以isNull()
结尾的QtGstreamer对象类型,只是封装指向原始C类型的指针的类,所以你必须将它们视为一个值而不是一个指针。