问题描述
我已经使用-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;
在两种情况下都表明程序格式错误,而不是缺乏标准支持。