我试图将QtGStreamer与2015的C++编译器结合使用,该编译器默认为C++11标准(或多或少)。
报头reflpointer.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;
}
};..。稍后在Repointer.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);
}其他人遇到了我收到的这里错误消息
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 ),并查看会发生什么。另外,如果你能打开一份关于这方面的错误报告,那就太好了。
有两件事:
(1)如果可能修复标头(并可能提交修补程序),我希望避免放弃C++11标准支持;
(2)我甚至不确定MSVC++15是否可以回到早期的标准版本(我很难在googling上找到它)。
与编译器消息所述相反,在未经训练的人看来,check确实被定义为QGlib::Private::RefPointerEqualityCheck的成员,因为您可以在QtGStreamer源中看到这里 (标题的那个版本与我在系统中使用的内容相同)。
Q:,鉴于以上所述,my代码有什么问题吗?可以帮助QtGstreamer解决问题吗?还是为早期版本的C++标准编译更好呢?
发布于 2016-12-13 14:27:17
事实证明,我的编译器并没有指出我遇到的问题的实际来源。RefPointer等式检查的模板参数是一个很大的提示。
我遇到这种情况是因为我将RefPointer与常量NULL进行比较,后者是#defined到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的operator==函数,但发现它不适用于int的X参数(它只允许传入指针 (X*)或其他RefPointer的)。
因此,您必须遍历您的QtGstreamer代码,并找到将RefPointer实例与NULL与==或!=进行比较的所有时间,并按如下方式修复它们:
if(ptr.isNull())要记住的是,values,所有RefPointer实例都是,而不是指针。如果您来自VisualC++世界(就像我一样),并且您希望,比方说,LPCSTR是一个简单的宏,向CSTR添加一个*,那么不要混淆了Ptr类和RefPointer在QtGstreamer中所做的事情!声明一个RefPointer (例如,ElementPtr)实际上会立即在堆栈上分配类的一个实例,因此将其与NULL进行比较是没有意义的。
但是您可以在上面调用isNull()来查看它是否为空,因为如果在堆栈上分配类,并且没有做一些奇怪的事情,比如声明一个ElementPtr*,那么类总是会被初始化的。
总之,RefPointer及其所有子类,包括以Ptr结尾的QtGstreamer对象类型,只是一个封装指向原始C类型的指针的类,因此必须将它们视为值而不是指针。
https://stackoverflow.com/questions/41123505
复制相似问题