由于 C++11 标准,QtGStreamer compile-time header 中的错误?

QtGStreamer compile-time error in header due to C++11 standard?

我正在尝试将 QtGStreamer 与 MS Visual Studio 2015 的 C++ 编译器一起使用,它默认为 C++11 标准(或多或少)。

header 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, looks like the code needs some additions to support C++11's nullptr. Try removing any compiler flags that enable C++11 functionality (including QTGSTREAMER_FLAGS if you are using cmake) and see what happens. Also, it would be nice if you open a bug report about this.

两件事:

(1) 如果可以修复 header(并可能提交补丁),我想避免放弃 C++11 标准支持;和

(2) 我什至不确定 MSVC++15 是否有 选项 返回到早期的标准版本(我无法通过谷歌搜索轻松找到它) .

与编译器消息所说的相反,在未经训练的人看来,check确实 定义为 QGlib::Private::RefPointerEqualityCheck 的成员,因为您可以在 QtGStreamer 源中看到 here(header 的版本与我在系统上使用的版本相同。)

Q: 综上所述,是不是my的代码有问题;可以贡献给 QtGstreamer 来解决问题的东西;或者我只是为 C++ 标准的早期版本编译更好?

事实证明,我的编译器没有指出我遇到的问题的实际 起源。 RefPointer 相等性检查的模板参数是一个 huge 提示。

我遇到这个是因为我正在比较 RefPointers 和常量 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!

编译器试图调用RefPointeroperator==函数,但发现它不适用于intX参数(它只允许你传递 pointers (X*) 或其他 RefPointers.)

所以你必须检查你的 QtGstreamer 代码并找到你将 RefPointer 实例与 NULL==!= 进行比较的所有时间,并修复它们如下:

if(ptr.isNull())

要记住的是 所有 RefPointer 实例都是 values,而不是 pointers.如果您来自 Visual C++ 世界(就像我一样),并且您期望 LPCSTR 是一个简单的宏,将 * 添加到 CSTR,请不要理解这与 QtGstreamer 中的 Ptr classes 和 RefPointer 混淆了!声明 RefPointer(例如 ElementPtr)实际上会立即在堆栈 上分配 class 的一个实例,因此将它与 NULL 进行比较是没有意义的.

但是你可以在它上面调用 isNull() 来查看它是否为 NULL,因为如果你在堆栈上分配它并且你没有做一些奇怪的事情,class 将始终被初始化就像声明一个 ElementPtr*.

总而言之,RefPointer 及其所有子class,包括以 Ptr 结尾的 QtGstreamer 对象类型,只是 class 封装一个指向原始C类型的指针,所以你必须把它们当作一个值而不是一个指针。