首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由于QtGStreamer标准,C++11标头中的编译时错误?

由于QtGStreamer标准,C++11标头中的编译时错误?
EN

Stack Overflow用户
提问于 2016-12-13 14:27:17
回答 1查看 118关注 0票数 2

我试图将QtGStreamer与2015的C++编译器结合使用,该编译器默认为C++11标准(或多或少)。

报头reflpointer.h包含以下内容:

代码语言:javascript
复制
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我们有以下内容:

代码语言:javascript
复制
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);
}

其他人遇到了我收到的这里错误消息

代码语言:javascript
复制
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++标准编译更好呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-13 14:27:17

事实证明,我的编译器并没有指出我遇到的问题的实际来源。RefPointer等式检查的模板参数是一个很大的提示。

我遇到这种情况是因为我将RefPointer与常量NULL进行比较,后者是#defined到0 (编译成int)。

因此,在做以下事情时:

代码语言:javascript
复制
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参数(它只允许传入指针 (X*)或其他RefPointer的)。

因此,您必须遍历您的QtGstreamer代码,并找到将RefPointer实例与NULL==!=进行比较的所有时间,并按如下方式修复它们:

代码语言:javascript
复制
if(ptr.isNull())

要记住的是,values,所有RefPointer实例都是,而不是指针。如果您来自VisualC++世界(就像我一样),并且您希望,比方说,LPCSTR是一个简单的宏,向CSTR添加一个*,那么不要混淆了Ptr类和RefPointer在QtGstreamer中所做的事情!声明一个RefPointer (例如,ElementPtr)实际上会立即在堆栈上分配类的一个实例,因此将其与NULL进行比较是没有意义的。

但是您可以在上面调用isNull()来查看它是否为空,因为如果在堆栈上分配类,并且没有做一些奇怪的事情,比如声明一个ElementPtr*,那么类总是会被初始化的。

总之,RefPointer及其所有子类,包括以Ptr结尾的QtGstreamer对象类型,只是一个封装指向原始C类型的指针的类,因此必须将它们视为值而不是指针。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41123505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档