Visual C ++为非模糊类报告模糊符号错误

时间:2016-12-16 10:53:56

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

考虑以下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&#39 ;:模糊符号

     

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

     

1> consoleapplication2.cpp(19):注意:或者'`anonymous-namespace' :: CodeCompletionTypeContextAnalyzer'

从C ++标准的角度来看,CodeCompletionTypeContextAnalyzer TypeAnalyzer是否真的含糊不清,或者这是一个MSVC错误。如果是这样,导致此错误的是什么。

解决方法是将代码更改为

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

1 个答案:

答案 0 :(得分:2)

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

  

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

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

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

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