我正在尝试将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的主要贡献者之一回答如下:



两件事情:

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

(2)我什至不确定MSVC++ 15是否可以选择返回到较早的标准版本(在谷歌搜索时无法轻易找到它)。

与编译器消息说的相反,未经训练的人会发现check实际上已定义为QGlib::Private::RefPointerEqualityCheck的成员,正如您在QtGStreamer源代码中看到的here一样( header 的版本与我在我的头上使用的相同系统。)

问:鉴于以上所述,我的代码是否有问题;有助于QtGstreamer解决该问题的内容;还是我最好编译为C++标准的早期版本?

最佳答案

事实证明,我的编译器并未将我指向所遇到问题的实际来源。 RefPointer相等性检查的模板参数是一个巨大的提示。

我遇到这个问题是因为我正在将RefPointer s与常量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!

编译器尝试调用RefPointeroperator==函数,但发现它不适用于Xint参数(它仅允许您传入指针(X*)或其他RefPointer s。)

因此,您必须遍历QtGstreamer代码,并找到将RefPointer实例与NULL==!=进行比较的所有时间,并按以下步骤进行修复:
if(ptr.isNull())

要记住的是,所有RefPointer实例都是值,而不是指针。如果您来自Visual C++世界(就像我一样),并且希望LPCSTR是一个简单的宏,将*添加到CSTR中,请不要将其与Ptr类和RefPointer混合在一起QtGstreamer!实际上,声明RefPointer(例如ElementPtr)会在堆栈
上立即分配类的实例,因此将其与NULL进行比较没有任何意义。

但是您可以在其上调用isNull()来查看它是否为NULL,因为如果在堆栈上分配该类并且您不会像声明ElementPtr*那样奇怪,则该类将始终被初始化。

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

关于c++ - 由于C++ 11标准, header 中的QtGStreamer编译时错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41123505/

10-10 08:16