【问题标题】:Visual C++ reports an ambiguous symbol error for non-ambiguous classVisual C++ 报告非歧义类的歧义符号错误
【发布时间】:2017-05-02 03:45:49
【问题描述】:

考虑以下 C++ 代码,

namespace {
  class ExprParentFinder {
    friend class CodeCompletionTypeContextAnalyzer;
  };
}

class CodeCompletionTypeContextAnalyzer {
public:
  CodeCompletionTypeContextAnalyzer() {}
};

int main() {
  CodeCompletionTypeContextAnalyzer TypeAnalyzer;
  return 0;
}

这与 Clang/GCC 编译得很好。但是,MSVC 阻塞并报告

1> ConsoleApplication2.cpp

1> consoleapplication2.cpp(29): 错误 C2872: 'CodeCompletionTypeContextAnalyzer': 不明确的符号

1> consoleapplication2.cpp(23): 注意:可能是 'CodeCompletionTypeContextAnalyzer'

1> consoleapplication2.cpp(19): note: or '`anonymous-namespace'::CodeCompletionTypeContextAnalyzer'

从 C++ 标准的角度来看,CodeCompletionTypeContextAnalyzer TypeAnalyzer 在这里真的是模棱两可,还是这是一个 MSVC 错误。如果是这样,是什么导致了这个错误。

解决方法是将代码更改为

int main() {
  ::CodeCompletionTypeContextAnalyzer TypeAnalyzer;
  return 0;
}

【问题讨论】:

  • CodeCompletionTypeContextAnalyzer 类是否曾经前向声明过?
  • 这是一个最小可重现的例子 - 这个代码文件是你唯一需要证明歧义的东西。
  • ExprParentFinder 如果没有声明,如何知道CodeCompletionTypeContextAnalyzer 的存在?
  • 来自朋友类 CodeCompletionTypeContextAnalyzer
  • 如果您将friend class CodeCompletionTypeContextAnalyzer; 更改为friend class ::CodeCompletionTypeContextAnalyzer; 会发生什么?

标签: c++ visual-c++ clang language-lawyer


【解决方案1】:

这是格式良好的(即 MSVC 错误),但不太可能是您真正想要的。 [namespace.memdef]/3,脚注省略:

如果非本地类中的friend 声明首先声明了一个类, 朋友是成员的函数、类模板或函数模板 最里面的封闭命名空间。 friend 声明确实 本身不会使名称对不合格的查找可见 ([basic.lookup.unqual]) 或限定查找 ([basic.lookup.qual])。

friend class CodeCompletionTypeContextAnalyzer;CodeCompletionTypeContextAnalyzer 声明为未命名命名空间的成员,但该名称对名称查找不可见。

然后,class CodeCompletionTypeContextAnalyzer { /* ... */ }; 声明(并定义)一个 不同 类,也称为 CodeCompletionTypeContextAnalyzer 全局命名空间的成员;这个班级不是ExprParentFinder的朋友。

由于未命名命名空间的CodeCompletionTypeContextAnalyzer 对名称查找不可见,因此唯一可以找到的CodeCompletionTypeContextAnalyzer 是第二个,并且没有歧义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2010-09-27
    • 1970-01-01
    相关资源
    最近更新 更多