如何解决g ++ 4.8.5上的全局名称空间存在问题可能不完整的C ++ 11支持
我已经使用-std = c ++ 11在最新的计算机上准备了一个项目。现在,我必须在g ++ 4.8.5(Red Hat 4.8.5-39)上进行编译。令我惊讶的是,此系统上对C ++ 11标准的支持似乎还不完整。请注意,该项目取决于gsoap库,该库在生产系统上也较早。
我正在使用以下构造:
public class App : Application
{
public App()
{
Device.SetFlags(new[] { "Markup_Experimental" });
MainPage = new TabbedPage
{
Children =
{
new ButtonPage(),new LabelPage()
}
};
}
}
在旧系统上出现以下错误:
class GeoGrid : public ::GeoGrid::GeoGridServiceSoapBindingProxy
{
public:
...
using ContextType = ::GeoGrid::GeoGrid2__ContextType;
...
}
我不知道这是由于旧的gsoap还是仅仅是旧的g ++而产生的。
我的问题是,如果不升级系统就可以解决此问题?我不得不承认,我一开始并不完全理解使用'::'令牌的所有后果,这只是一个幸运的猜测,它在新系统上非常有效。
解决方法
您的代码段符合以下情况:
/*
struct A {
struct B {};
}; */
namespace X
{
struct A {
using B = ::A::B;
};
}
使用新的gcc(v10)制作
error: 'A' in namespace '::' does not name a type
using C = ::A::B;
或与此(旧版本(v 4.7及更高版本)
error: expected type-specifier before '::' token
using C = ::A::B;
在全局命名空间中没有A::B
(在您的情况下为GeoGrid::GeoGridServiceSoapBindingProxy
的情况下,上面的错误仅 生成,因此::A::B
不是一个合法的类型名,因此编译器认为A
是当前上下文范围内的合法类型名,并且在范围分隔符::
之前的消息表示缺少所需的上下文标识符。较新版本的错误消息比技术上正确但易误解的较旧版本更易读。
这种情况的另一个版本是
struct A {
using C = ::A::B;
struct B {};
};
在using C
存在的行中,B
尚不作为一种类型存在,从而导致GCC 4.8出现相同的错误消息。较新的版本会告诉您该类型不完整。
error: invalid use of incomplete type 'struct A'
using C = ::A::B;
在两种情况下都表明程序格式错误,而不是缺乏标准支持。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。