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;

在两种情况下都表明程序格式错误,而不是缺乏标准支持。