【问题标题】:Problem with global namespace on g++ 4.8.5 (maybe incomplete C++11 support)g++ 4.8.5 上的全局命名空间问题(可能不完整的 C++11 支持)
【发布时间】:2020-10-06 17:25:11
【问题描述】:

我在最新的计算机上使用 -std=c++11 准备了一个项目。现在,我必须在 g++ 4.8.5(Red Hat 4.8.5-39)上编译它。令我惊讶的是,该系统对 C++11 标准的支持似乎并不完整。请注意,该项目依赖于 gsoap 库,该库在生产系统上也较旧。

我正在使用以下构造:

class GeoGrid : public ::GeoGrid::GeoGridServiceSoapBindingProxy
{
public:
  ...
  using ContextType = ::GeoGrid::GeoGrid2__ContextType;
  ...
}

我在旧系统上收到以下错误:

api-2-0.h:434:23: error: expected type-specifier before ‘::’ token
   using ContextType = ::GeoGrid::GeoGrid2__ContextType;

我不知道这是由于旧的 gsoap 还是只是旧的 g++。

我的问题是是否可以在不升级系统的情况下解决这个问题?我不得不承认,我一开始并没有完全理解使用'::'令牌的所有后果,这只是一个幸运的猜测,在新系统上完美运行。

【问题讨论】:

  • 为什么您认为该错误消息暗示缺乏 C++11 支持?根据this page,GCC 4.8 几乎支持所有 C++11(核心语言)特性。
  • 所以,你认为 gobal 命名空间在两个系统上都得到完美且相同的支持 - 然后我必须在其他地方寻找错误,可能是 gsoap 的不同行为
  • 为了排除对 C++11 的支持,也许您可​​以尝试使用常规的 typedef?

标签: c++ c++11 gsoap


【解决方案1】:

你的sn-p符合以下情况:

/*
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;

在这两种情况下,这表明程序格式不正确,而不是缺乏标准支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-13
    • 2015-06-06
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 2021-01-02
    相关资源
    最近更新 更多