由于C++;11标准? 我尝试使用QtgStuffER与MS Visual Studio 2015的C++编译器,默认为C++ 11标准(或多或少)。

由于C++;11标准? 我尝试使用QtgStuffER与MS Visual Studio 2015的C++编译器,默认为C++ 11标准(或多或少)。,c++,qt,compiler-errors,gstreamer,C++,Qt,Compiler Errors,Gstreamer,标题refpointer.h包含以下内容: 模板 结构RefPointerQualityCheck { 静态内联布尔检查(常量RefPointer和self、X*常量和其他) { 返回self.m_类?self.m_类->m_对象==其他:!其他; } }; 。。。稍后在refpointer.h中,我们有以下内容: 模板 模板 布尔引用指针::运算符==(常量X和其他)常量 { return Private::RefPointerEqualityCheck::check(*此,其他); } 模

标题refpointer.h包含以下内容:

模板
结构RefPointerQualityCheck
{
静态内联布尔检查(常量RefPointer和self、X*常量和其他)
{
返回self.m_类?self.m_类->m_对象==其他:!其他;
}
};
。。。稍后在refpointer.h中,我们有以下内容:

模板
模板
布尔引用指针::运算符==(常量X和其他)常量
{
return Private::RefPointerEqualityCheck::check(*此,其他);
}
模板
模板
布尔引用指针::运算符=(常数X和其他)常数
{
return!Private::RefPointerEqualityCheck::check(*此,其他);
}
其他人遇到了我收到的错误消息:

qt5gstreamer\qglib\refpointer.h(280):错误C2039:“检查”:不是“qglib::Private::refpointerqualitycheck”的成员
具有
[
T=QGst::BufferList,
X=int
]
QtGStreamer的主要贡献者之一回复如下:

if(ptr.isNull())
嗯,看起来代码需要添加一些东西来支持C++11 nullptr。尝试删除启用C++11的所有编译器标志 功能(如果您使用的是cmake,则包括QTGSTREAMER_标志)和 看看会发生什么。另外,如果你打开一个bug报告也会很好 关于这个

两件事:

(1) 如果可以修复头文件(或者提交补丁),我希望避免放弃对C++11标准的支持;及

(2) 我甚至不确定MSVC++15是否有返回到早期标准版本的选项(我在谷歌上很难找到)

与编译器消息所说的相反,在未经培训的人看来,
check
确实被定义为
QGlib::Private::RefPointerEqualityCheck
的成员,正如您在QtGStreamer源代码中看到的那样(该版本的头与我在系统上使用的头相同)


Q:鉴于上述情况,我的代码是否有问题;可以帮助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
运算符==
函数,但发现它不适用于
int
X
参数(它只允许您传入指针(
X*
)或其他
RefPointer

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

if(ptr.isNull())
要记住的是,所有RefPointer实例都是值,而不是指针。如果你来自VisualC++世界(我是这样),并且你期望,例如,代码> LPCSTR 是一个简单的宏,添加一个<代码> */C> > <代码> CSTR ,不要在QtgSturver中与<代码> PTR <代码> >类和<代码> RefPosix< /Case>做混淆。声明
RefPointer
(例如,
ElementPtr
)实际上会立即在堆栈上分配类的一个实例,因此将其与NULL进行比较毫无意义

但是您可以对它调用
isNull()
,查看它是否为NULL,因为如果在堆栈上分配该类,则该类将始终被初始化,并且您没有执行类似于声明
ElementPtr*
的奇怪操作


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

这是您应该将对
NULL
的任何检查替换为
nullptr
的主要原因。那会让你犯错误的。唯一应该检查是否为null的时间是指针类型。即使
RefPointer
包装指针,它也不是指针类型。指针类型是
T*
,比如
int*
char*
,或者
RefPointer*
。是的,我最终发现了答案中所写的关于
RefPointer
(它不是指针类型)的事实。感谢您提供有关
nullptr
的提示;我以后一定会用的。很奇怪,
RefPointer
的语义通常与实际指针相似,但各种“gotchas”都不起作用。例如,要在包装的原始类型上调用函数,必须使用
->
(也有一个重载运算符)。有趣的。。。