【问题标题】:clang error messages for qualified names and using declaractions限定名称和使用声明的 clang 错误消息
【发布时间】:2019-04-15 10:25:40
【问题描述】:

考虑下面的代码。

namespace A::B::C::D::E {
    struct X { };
}

namespace B {
    using namespace A::B::C::D::E;
    // or, using A::B::C::D::E::X;
    // or, using X = A::B::C::D::E::X;
}

假设我以某种方式错误地使用了 B::X 并得到了错误。至少在 clang 中,该错误看起来像

error: ... for type A::B::C::D::E::X.

我更愿意为B::X 声明错误。

有没有办法将 clang 错误消息配置为使用 using 声明的位置,而不是别名实体?

【问题讨论】:

  • 如果你错误地使用了B::x,编译器只会提到B::x。见gcc.godbolt.org/z/dROyG1
  • @VTT:所以并非总是如此。并且 OP 希望它始终参考B::X
  • @P.W 是正确的。

标签: c++ compiler-errors namespaces clang name-lookup


【解决方案1】:

我认为编译器使用 A::B::C::D::E::X 是好的,否则它可能会模棱两可。就像下面的例子:

namespace A::B::C::D::E {
    struct X {
      int y;
    };
}

namespace B {
  using namespace A::B::C::D::E;

  void foo() {
    X aa;
    B::X bb;
    aa.y = 0;
  }

  struct X {
    int z;
  };

  void bar() {
    X aa;
    B::X bb;
    aa.y = 0;
  }

}

int main() {
  return 0;
}

可以在 B 命名空间中声明一个结构 X,然后是 B::X,需要调用另一个 A::B::C::D::E::X,否则他们无法区分。

【讨论】:

  • 确实如此,但我认为 clang 足以识别我们案例中的差异。即,使用using 指令using 声明,而不是类型声明和/或定义。我不认为编译器如何对待我们的情况相同。
猜你喜欢
  • 2012-01-17
  • 1970-01-01
  • 2019-12-28
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多