由于 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 提示。
我遇到这个是因为我正在比较 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==
函数,但发现它不适用于int
的X
参数(它只允许你传递 pointers (X*
) 或其他 RefPointer
s.)
所以你必须检查你的 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类型的指针,所以你必须把它们当作一个值而不是一个指针。
我正在尝试将 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 提示。
我遇到这个是因为我正在比较 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==
函数,但发现它不适用于int
的X
参数(它只允许你传递 pointers (X*
) 或其他 RefPointer
s.)
所以你必须检查你的 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类型的指针,所以你必须把它们当作一个值而不是一个指针。