【问题标题】:C++ strange namespace lookup behavior [duplicate]C ++奇怪的名称空间查找行为[重复]
【发布时间】:2016-05-27 21:55:25
【问题描述】:
namespace fooo {
  class Fooo {
  public:
    int a;
  };
}

namespace fooo {
  class Test {
  public:
    Test(Fooo::Fooo *i) {
      i->a = 1;
    }
  };
}

此代码在 clang(任何版本)下都能正常编译,但在 gcc 下编译失败。 谁能解释一下为什么?

编辑: 是的,我知道这里的问题很明显,但为什么 clang 接受它?告诉我这个的人说这是标准中的一个错误,并且有一个缺陷报告。任何人都可以指出实际的 DR 吗?

【问题讨论】:

  • gcc 没告诉你吗?如果编译失败,它通常会显示一条诊断消息。
  • 错误:'fooo::Fooo::Fooo' 命名构造函数,而不是类型
  • 即使第一个Fooo是错字:错误:在只读对象中分配成员'fooo::Fooo::a'
  • 啊,那是在类定义中注入的旧类名。通常,这个 iirc 中的 clang 是错误的,但我不记得具体细节。让我看看能不能找到骗子。
  • 抱歉,我删除了 const。

标签: c++ c++11 c++14


【解决方案1】:

来自 gcc 的错误消息会告诉您确切的问题所在:

t.cpp:11:16: error: ‘fooo::Fooo::Fooo’ names the constructor, not the type
     Test(const Fooo::Fooo *i) {
                ^

令人惊讶的是,clang 没有报错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-14
    • 2017-05-10
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多