我正在尝试将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!
编译器尝试调用
RefPointer
的operator==
函数,但发现它不适用于X
的int
参数(它仅允许您传入指针(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/